Blogger Information
Blog 17
fans 0
comment 1
visits 14694
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP:类属性与类方法重载以及回调执行 - 2019.10.8
Alfred的博客
Original
733 people have browsed it

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

运行实例 »

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



Correction status:qualified

Teacher's comments:用回调的方式业执行一个函数,非常重要
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments