php - 在另一个函数中使用 php 的魔术函数不起作用

标签 php overloading isset

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

作品:

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 错误吗?

最佳答案

empty() 首先*调用 __isset() 方法,只有当它返回 true 时才调用 __get() 方法。也就是说,您的类(class)也必须实现 __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)

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

关于php - 在另一个函数中使用 php 的魔术函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2645927/

相关文章:

java - 您可以使用泛型进行方法重载并且只更改方法签名的泛型类型吗?

asp.net-mvc - Controller 中的方法重载

php - 哪种方法会更快?错误抑制@ $ _ REQUEST ['x']或通过isset($ _ REQUEST ['x'])

php - isset条件在不同的点击下表现不同

php - 检查值是否为 isset 和 null

php - codeigniter中的SQL查询错误

php - 为什么这个无限滚动在 IE 中不起作用?

c++ - 您应该如何为自定义类实现 STL 功能?

javascript - 类似 Twitter 的推文框?

JavaScript 表单验证未按预期工作,即使有错误也会提交表单