1.属性重载
主要使用以下四种魔术方法实现属性重载:
__get():读操作,
__set():写操作,
__isset():判断是否有值,
__unset():释放变量
实例
<?php /** * * @authors Alfred (jusheng_yao@outlook.com) * @date 2019-10-09 22:08:35 * @version 1.0 */ // 属性重载:__get(), __set(), __isset(), __unset() class UserInfo { public $name; private $salary = 9999; protected $password; public function __construct($name, $password) { // 对象的引用 $this->name = $name; $this->password = $password; } // 属性重载方法:由系统调用 // 1. __get(): 重载了用户对属性的访问,即读操作 public function __get($name) { return ($this->name === 'admin') ? $this->$name : '权限不够!'; } // 2. __set($name, $value): 写操作 public function __set($name, $value) { if ($name === 'salary') { if ($this->name === 'admin'){ $this->$name = $value; echo "工资更新成功!<br>"; }else{ echo '工资更新需要权限!<br>'; } // return ($this->name === 'admin') ? ($this->$name = $value) : '工资更新需要权限!'; } return $this->$name = $value; } // 3. __isset($name):判断是否有值 public function __isset($name) { return isset($this->$name); } //4. __unset($name):释放资源 public function __unset($name) { unset($this->$name); } } $obj = new UserInfo('大师兄', '123456'); $obj1 = new UserInfo('admin', '123456'); // 1.读操作 echo $obj->salary . '<hr>'; // 2.写操作 echo ($obj->salary = 15000); echo '<hr>'; // 3.判断是否有值 echo isset($obj->name); echo '<hr>'; // 4.释放变量 unset($obj->password); echo '<hr>'; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
2.方法重载
以魔术方法__call()、__callStatic()分别实现对普通方法和静态方法的重载
实例
<?php /** * * @authors Alfred (jusheng_yao@outlook.com) * @date 2019-10-09 22:08:40 * @version 1.0 */ // 方法重载: __call()、__callStatic() class TestDemo { // __call(): 访问一个不存在或无权限访问的方法的时候会自动调用 public function __call($name, $args) { return '方法是: ' . $name . '<br>参数列表: <pre>' . print_r($args, true); } // __callStatic(): 访问一个不存在或无权限访问的静态方法的时候会自动调用 public static function __callStatic($name, $args) { return '方法是: ' . $name . '<br>参数列表: <pre>' . print_r($args, true); } } $obj = new TestDemo(); echo $obj->getInfo1(1, 2, 3); echo '<hr>'; echo TestDemo::getInfo2('html', 'css', 'js', 'ES6', 'vue'); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
3.回调执行
分别使用call_user_func()和call_user_func_array()方法实现对函数和类方法(包括普通和静态方法)的回调
实例
<?php /** * * @authors Alfred (jusheng_yao@outlook.com) * @date 2019-10-13 12:08:35 * @version 1.0 */ namespace _1008; // 函数 function sum($a, $b) { return "{$a} + {$b} = " . ($a + $b); } // 类 class Test { public function reduce($a, $b) { return "{$a} - {$b} = " . ($a - $b); } public static function multiply($a, $b) { return "{$a} x {$b} = " . ($a * $b); } } // 执行回调方法 echo call_user_func(__NAMESPACE__ . '\sum', 11, 22); echo "<hr>"; // 执行回调方法 - 数组 echo call_user_func_array(__NAMESPACE__ . '\sum', [1, 2]); echo "<hr>"; // 执行回调对象中的公共方法 echo call_user_func_array([new Test(), 'reduce'], [22, 11]); echo "<hr>"; // 执行回调对象中的静态方法 echo call_user_func_array(__NAMESPACE__ . '\Test::multiply', [11, 11]); echo "<br>"; // 或者 使用 ::class echo call_user_func_array([Test::class, 'multiply'], [11, 12]); echo "<hr>"; ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例