【问题标题】:Using php's magic function inside another function does not work在另一个函数中使用 php 的魔法函数不起作用
【发布时间】:2010-04-15 14:00:25
【问题描述】:

我想使用魔术函数 __set()__get() 在 php5 类中存储 SQL 数据,但在函数中使用它们时遇到了一些奇怪的问题:

作品:

if (!isset($this->sPrimaryKey) || !isset($this->sTable))
 return false;
$id = $this->{$this->sPrimaryKey};
if (empty($id))
 return false;
echo 'yaay!';

不起作用:

if (!isset($this->sPrimaryKey) || !isset($this->sTable))
    return false;
if (empty($this->{$this->sPrimaryKey}))
   return false;
echo 'yaay!';

这会是一个 php 错误吗?

【问题讨论】:

    标签: php overloading isset


    【解决方案1】:

    empty() first* 调用 __isset() 方法,并且仅当它返回 true 时才调用 __get() 方法。即你的类也必须实现 __isset()。

    例如

    <?php
    class Foo {
    
      public function __isset($name) {
        echo "Foo:__isset($name) invoked\n";
    
        return 'bar'===$name;
      }
    
      public function __get($name) {
        echo "Foo:__get($name) invoked\n";
        return 'lalala';
      }
    }
    
    $foo = new Foo;
    var_dump(empty($foo->dummy));
    var_dump(empty($foo->bar));
    

    打印

    Foo:__isset(dummy) invoked
    bool(true)
    Foo:__isset(bar) invoked
    Foo:__get(bar) invoked
    bool(false)
    

    * 编辑:如果它不能“直接”在对象的属性哈希表中找到可访问的属性。

    【讨论】:

    • @Richard:没有。 5.1.0 Added __isset() and __unset().
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多