登录  /  注册
博主信息
博文 17
粉丝 0
评论 1
访问量 14052
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP:类属性与类方法重载以及回调执行 - 2019.10.8
Alfred的博客
原创
691人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学