前言
本文就介绍了PHP类的重载的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、重载
- 重载是指动态的创建类的属性和方法。
- 通过魔术方法来实现的。这些魔术方法的参数都不能通过引用传递。
- 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
- 所有的重载方法都必须被声明为 public。
二、属性重载
- __set():在给不可访问属性赋值时,会调用该方法。public __set ( string $name , mixed $value ) : void
- __get():读取不可访问属性的值时,会调用该方法。public __get ( string $name ) : mixed
- __isset():当对不可访问属性调用 isset() 或 empty() 时,会调用该方法。public __isset ( string $name ) : bool
- __unset():当对不可访问属性调用 unset() 时,会调用该方法。public __unset ( string $name ) : void
- 属性重载只能在对象中进行。
- 在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。
class MyClass{
private $data = array();
function __set($name,$value){ //重载方法必须声明为public
echo "Setting ".$name." to ".$value."<br>";
$this->data[$name] = $value;
}
function __get($name){
echo "Getting ".$name."<br>";
if(array_key_exists($name, $this->data)){
return $this->data[$name];
}else{
return "not found";
}
}
function __isset($name){
echo "Is ".$name." set?\n";
return isset($this->data[$name]);
}
function __unset($name){
echo "Unsetting ".$name."<br>";
unset($this->data[$name]);
}
}
$foo = new MyClass();
$foo->var1 = 1; //会走类里的__set方法重载
echo "---------<br>";
echo $foo->var1."<br>"; //会走类里的__get方法
echo "---------<br>";
echo $foo->var2."<br>"; //会走类里的__get方法
echo "---------<br>";
var_dump(isset($foo->var1)); //会走类里的__isset方法
echo "<br>";
echo "---------<br>";
var_dump(isset($foo->var2)); //会走类里的__isset方法
echo "---------<br>";
unset($foo->var1); //会走类里的__unset方法
echo "---------<br>";
echo $foo->var1."<br>"; //会走类里的__get方法
三、方法重载
- __call():在对象中调用一个不可访问方法时,会调用该方法。public __call ( string $name , array $arguments ) : mixed
- __callStatic():在静态上下文中调用一个不可访问方法时,会调用该方法。public static __callStatic ( string $name , array $arguments ) : mixed
- $name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
class MyClass{
function __call($name,$arguments){
echo "Calling object method '$name' arguments为:";
var_dump($arguments);
}
static function __callStatic($name,$arguments){
echo "Calling static method '$name' arguments为:" .implode(',', $arguments)."<br>";
}
}
MyClass::MyFun1('hello world','你好'); //调用__callStatic方法,方法名为MyFun1,参数为一个数组array('hello world','你好');
$foo = new MyClass();
$foo->MyFun(['PHP','Java']); //调用__call方法,方法名为MyFun,参数为array(array('PHP','java'))
总结
以上就是今天要讲的内容,本文仅仅简单介绍了PHP类的重载的基础方法。
- 动态的创建类的属性和方法。
- 通过魔术方法来实现的,参数不能通过引用传递。
- 所有的重载方法必须声明为public。
- 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
- 属性的重载:__set(),__get(),__isset(),__unset()。
- 方法的重载:__call(),__callStatic()。第一个参数为方法名,第二个参数为方法参数的枚举数组。