tey*_*non 16 php overloading countable
在PHP 5中,您可以使用魔术方法,重载某些类等.在C++中,只要参数类型不同,就可以实现存在的函数.有没有办法在PHP中执行此操作?
我想做的一个例子是:
class a {
function a() {
$this->list = array("1", "2");
}
}
$blah = new a();
count($blah);
Run Code Online (Sandbox Code Playgroud)
我想要等待返回2. IE计算类中特定数组的值.所以在C++中,我这样做的方式可能如下所示:
int count(a varName) { return count(varName->list); }
Run Code Online (Sandbox Code Playgroud)
基本上,我正在尝试简化大型应用程序的数据调用,所以我可以调用:
count($object);
Run Code Online (Sandbox Code Playgroud)
而不是
count($object->list);
Run Code Online (Sandbox Code Playgroud)
该列表可能是一个对象列表,因此根据它的使用方式,如果有人必须以当前的方式执行它,那么它可能是非常令人讨厌的声明:
count($object->list[0]->list[0]->list);
Run Code Online (Sandbox Code Playgroud)
那么,我可以制作类似的东西:
function count(a $object) {
count($object->list);
}
Run Code Online (Sandbox Code Playgroud)
我知道PHP的计数接受混合var,所以我不知道我是否可以覆盖单个类型.
小智 33
听起来你想要实现这个Countable界面:
class a implements Countable {
public function __construct() {
$this->list = array("1", "2");
}
public function count() {
return count($this->list);
}
}
$blah = new a();
echo count($blah); // 2
Run Code Online (Sandbox Code Playgroud)
Ja͢*_*͢ck 22
tl; dr - 答案在底部:)
在PHP中,这个模型是相反的; 而不是使用不同的参数类型重载函数(而不是方法),每个类都用于为每个函数定义魔术方法.
下面是可以在课堂内定义魔术行为的函数列表.在示例中,每个引用$obj都是类的实例,->unknown引用缺少的属性并->blamethod()引用缺少的方法.
__toString() - 当您的对象在字符串上下文中使用时调用此方法,例如 echo "My object is: $obj\n";
__invoke([$arg1..n]) - 当您的对象用作函数时,此方法被调用,例如 $obj($a, $b);
__get($prop)- 允许拦截尝试访问您班级的不存在的财产,例如$obj->unknown; 顺便说一句,这有时可以用作延迟加载某些属性的方法,否则这些属性在构造函数中完成时会进行大量处理.
__set($prop, $value) - 在设置不存在的属性时调用,例如 $obj->unknown = 42;
__isset($prop)- 调用以确定是否存在不存在的属性(我意识到听起来有多么有趣),例如isset($obj->unknown)会调用$obj->__isset('unknown')
__unset($prop) - 在这样的情况下调用 unset($obj->unknown);
__call($name, $arguments)- 拦截对你的类的未实现方法的$obj->blamethod(1, 2, 3);调用,例如将调用$obj->__call('blamethod', array(1, 2, 3));
__callStatic($name, $arguments)- __call()但是你将无法$this在你的实现中使用.
__clone() - 在调用时$x = clone $obj;调用,因此您可以决定保留哪些数据以及丢弃的数据.
使用SPL,通过实现某些接口引入了一些概念:
Traversable- 一个抽象接口,用于定义类在foreach构造中使用时所执行的操作; 调用具体的接口Iterator.
ArrayAccess - 允许像使用数组一样使用类实例的接口.
Serializable-这定义了两种方法的一个接口来被要求serialize()或unserialize().它与使用__sleep()和相互排斥__wakeup().
Countable- 定义count()在类实例上执行时要调用的一个方法.