php魔术方法的使用


1、魔术方法:

/** * @purpose: 魔术方法 __get() , __set(), __isset(), __call, __callStatic, __toString, __invoke 的使用 * User: daicr * Date: 2019/3/4 * Time: 11:10 * * 1、当我们调用一个权限上不允许调用的属性,和不存在的属性时,__get魔术方法会自动调用 * * 2、当为无权操作的属性赋值时,或不存在的属性赋值时,__set()自动调用 * * 3、当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性),会引发 __isset()来执行 * * 4、当所调用对象的方法不存在时默认调用 __call * * 5、当所调用对象的静态方法不存在时默认调用 __callStatic * * 6、当一个类或者对象被当做字符串返回时,会调用 __toString 来输出 * * 7、当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。 */
class Test { /** * @var string 私有属性,外部方法访问不了,会默认调用 __get */
    private $username = 'daicr'; /** * @var array 存放对象的属性数组 */
    protected $attributes = []; /** * @purpose: 当我们调用一个权限上不允许调用的属性,和不存在的属性时,__get魔术方法会自动调用 * @param string $name 属性名 * @return mixed */
    public function __get($name) { if(array_key_exists($name,$this->attributes)){ return $this->attributes[$name]; } } /** * @purpose: 当为无权操作的属性赋值时,或不存在的属性赋值时,__set()自动调用 * @param string $name 属性名 * @param mixed $value 属性值 */
    public function __set($name, $value) { if(property_exists($this,$name)){ $this->$name = $value; }else{ $this->attributes[$name] = $value; } } /** * @purpose: 当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性),会引发 __isset()来执行 * @param string $name 属性名 * @return bool */
    public function __isset($name) { if(isset($this->attributes[$name])){ return true; } } /** * @purpose: 当所调用对象的方法不存在时默认调用 __call * @param string $name 方法名 * @param mixed $arguments 参数 */
    public function __call($name, $arguments) { // 注意: $name 的值区分大小写
        echo "对象方法名: '$name' , 参数:" . implode(', ', $arguments). "\n"; } /** * @purpose: 当所调用对象的静态方法不存在时默认调用 __callStatic * @param string $name 方法名 * @param mixed $arguments 参数 */
    public static function __callStatic($name, $arguments) { // 注意: $name 的值区分大小写
        echo "对象静态方法名: '$name' " . implode(', ', $arguments). "\n"; } /** * @purpose: 当一个类或者对象被当做字符串返回时,会调用 __toString 来输出 * @return string */
    public function __toString() { return __CLASS__; } /** * @purpose: 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。 */
    public function __invoke() { echo 'invoke'; } /** * @purpose: 打印对象属性数组 */
    public function index(){ var_dump($this->attributes); } }

2、调用魔术方法(在另外一个类的方法里面)

public function index() { $testModel = new Test(); // 访问一个私有属性,如果没有__get(),是会报错的。过程:$testModel->username--没有权限-->__get('username');
    echo $testModel->username; //$testModel没有age属性,但是会通过__set()进行赋值
    $testModel->age=26; $testModel->index(); //array(1) { ["age"]=> int(26) }

    echo $testModel->test('hello');  //"对象方法名: 'test' , 参数:hello

    echo $testModel::test( ['hello','world']);  //"对象静态方法名:'test' , 参数:hello //直接输出对象的时候,会输出对象名的字符串形式. 输出值为: Test
    echo $testModel; //把类当做方法来使用,会调用__invoke , 输出值为:invoke.
    echo $testModel(); }

此文章为小代在工作中的总结,如有转载请注明出处https://www.cnblogs.com/chrdai/

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM