后期静态绑定十分灵活

Original 2019-05-11 18:14:39 184
abstract://重载技术//重载:动态的创建类属性和方法//属性重载//__set(),__get(),__isset(),__unset()//const IS_ISSET = true;//const IS_GET = true;//const IS_SET = true;//const IS_UNSET = false;////class Visit//{// protecte

//重载技术
//重载:动态的创建类属性和方法
//属性重载
//__set(),__get(),__isset(),__unset()
//const IS_ISSET = true;
//const IS_GET = true;
//const IS_SET = true;
//const IS_UNSET = false;
//
//class Visit
//{
// protected $data = [];
//
// public function __isset($name)//在判断是否存在时自动执行
// {
// return IS_ISSET && isset($this->data[$name]);
// }
//
// public function __get($name)//外部对内部的值进行访问时自动执行
// {
// return IS_GET ? $this->data[$name] : '非法访问';
// }
//
// public function __set($name, $value)//对对象的成员进行赋值是自动调用
// {
// IS_SET ? $this->data[$name] = $value : '禁止赋值';
// }
//
// public function __unset($name)//在外部对内部成员进行销毁时自动调用
// {
// if (IS_UNSET) {
// unset($this->data[$name]);
// } else {
// echo '禁止删除';
// }
// }
//}
//
//$visit = new Visit();
//if (isset($visit->table)) {
// echo $visit->table . '
';
//} else {
// $visit->table = 'table_staff';
//}
//
////访问
//echo $visit->table . '
';
//
////更新
//$visit->table = '员工表' . '
';
//
////访问
//echo $visit->table . '
';
//
//unset($visit->table);

//方法重载
//_call(),_callStatic()
class Site
{
public function show($argumnets)
{
$title = func_get_arg(0);//获取方法中的参数
$desc = func_get_arg(1);
return 'Site::show()
站点名称' . $title . '
站点描述:' . $desc;
}

public static function add($argument)
{
$m = func_get_arg(0);
$n = func_get_arg(1);
return 'Site::add()
'.$m.'+'.$n.'='.($m+$n);
}
}

class Web
{
//当访问一个不存在的动态方法的时候会自动调用,$name为方法名,$arguments为参数
public function __call($name, $arguments)
{
// return '方法:'.$name.'
参数列表:'.var_export($arguments,true);
//方法重载更多的用在跨类的方法调用上,第一个参数为一个数组,数组的第一个值为要访问的类的实例化,第二个值为调用的访问类的方法,第二个参数为传给该方法的值
return call_user_func_array([(new Site),'show'],$arguments);
}

//当访问一个不存在的静态方法的时候会自动调用,$name为方法名,$arguments为参数
public static function __callStatic($name, $arguments)
{
//跨类调用一个静态方法
return call_user_func_array(['Site','add'],$arguments);
}

}

$web = new Web();

//访问一个不存在的方法
echo $web->show('李铭炜','牛逼').'


';
echo Web::add('1','2');

Correcting teacher:天蓬老师Correction time:2019-05-13 09:31:40
Teacher's summary:所谓重载, 其实就是对类中方法和属性的重载, 要注意重载 与重写的区别, 重载是发生在外部访问时发生, 而重写则在是继承的上下文环境中

Release Notes

Popular Entries