博客列表 >PHP:类属性与类方法重载以及回调执行 - 2019.10.8

PHP:类属性与类方法重载以及回调执行 - 2019.10.8

Alfred的博客
Alfred的博客原创
2019年10月13日 18:47:18728浏览

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>";
?>

运行实例 »

点击 "运行实例" 按钮查看在线实例



声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议