好问题
Good  Question
  • 首 页
  • 问题
    • PHP
    • JAVA
    • CPlusPlus
    • C#
    • SQL
  • 关 于
  • 联 系
PHP中__get和__set的魔术方法 关闭 返回上一级  

PHP中__get和__set的魔术方法
+ 查看更多

发布日期:2018-03-10 15:32
分类:PHP
浏览次数:89
除非我完全错了,__get和__set方法应该允许重载get和set方法。
例如,以下语句应调用__get方法:
echo $foo->bar;
$var = $foo->bar;
并且以下应该调用__set方法:
$foo->bar = 'test';
但是,这在我的代码中无法工作,下面是这个简单的例子:
class foo {

    public $bar;
    public function __get($name) {

        echo "Get:$name";
        return $this->$name;
    }

    public function __set($name, $value) {

        echo "Set:$name to $value";
        $this->$name = $value;
    }
}

$foo = new foo();

echo $foo->bar;
$foo->bar = 'test';

echo "[$foo->bar]";
这只会输出:
[test]
把die()函数放在代码中,结果显示它根本没有调用这两个方法。
现在,我在需要使用的地方手动使用__get方法,但是这种方式不是很灵活,需要特别调用,否则'重载'代码实际上没有被调用。我想知道这是否不是以我理解的方式运行,为什么这不起作用。
代码运行在php 5.3.3版本中。

回答

_get,_set,__call和__callStatic在方法或属性不可访问时才能被调用。你的$bar是公共的,因此不能调用这些方法。
请参阅手册中的属性重载部分:
__set()用于向不可访问的属性写入数据。
__get()用于从不可访问的属性读取数据。
魔术方法不是getter和setter方法的替代。它们只允许您处理方法调用或属性访问,否则会导致错误。因此,它们更多的与错误处理相关。还要注意,它们比使用正确的getter和setter或直接方法调用慢得多。
上一篇在PHP中裁减图像
在PHP中把String类型转换成Float类型下一篇
下一篇在PHP中把String类型转换成Float类型

最新文章

  • 函数`__construct`用来干嘛的
    发布日期:2018-03-26
  • 通过访客的IP得到他们的地区
    发布日期:2018-03-26
  • 合并两个PHP对象的最好的方法是什么?
    发布日期:2018-03-26
  • 该如何把一该如何把一个对象转化成数组?
    发布日期:2018-03-26
  • 什么是输出缓冲区?
    发布日期:2018-03-26
  • 在PHP中怎么把用逗号分隔的字符串分隔在一个数组里?
    发布日期:2018-03-26
  • 在PHP中使用foreach循环时查找数组的最后一个元素
    发布日期:2018-03-26
关于好问
收集整理一些有用的问题和回答,造福中国的程序旺和IT喵们!
友情链接
起飞页 
相关信息
版权声明
Copyright © 2016 - 2022  苏州卡达网络科技有限公司 备案号:苏ICP备09008221号