【问题标题】:Checking if variable exists for child class检查子类是否存在变量
【发布时间】:2013-11-13 17:24:34
【问题描述】:

我正在为我的父类创建全局 setter 和 getter,因为我不想为每个子类变量创建它们(但我偶尔会覆盖父全局 setter/getter)。

我正在使用 __call 并且我正在解析方法名称,如下所示:

if (strtolower(substr($method, 0, 3)) == "set") {
  $variable = strtolower(substr($method, 3));
}

问题是如何检查 $variable 是否为子类(扩展主类)设置;

如果我这样做:

if ($this->$variable)

我想它首先检查它是否存在于子类中,然后它检查它是否存在于主类中。我只希望它检查子类,可以这样做吗?

我知道有 parent:: 但是有没有 child 的等价物?

编辑: 人们不明白我在问什么。 我知道如何检查该属性是否存在。我想知道的是如何检查 CHILD 类的属性是否存在,而不是 MAIN 类。 (CHILD 类扩展 MAIN)

【问题讨论】:

  • 也许我遗漏了一些东西,但我不明白你为什么使用__call 方法。如果你的代码是正确的面向对象的,你就不需要求助于这种奇特的解决方案。
  • 我有数百个属性,我不想在我的类中填充:setThis、setThat、setThose、setThem(get 也一样)。我只想在它们执行其他操作而不是设置或获取数据(例如清理)时创建这些函数。
  • 这个问题可以通过其他类继承的一个抽象类来解决。另一个好处是合同变得清晰。有了__call,一切都变得神奇了。
  • 什么意思?你能给我举个例子吗。听起来很有趣!
  • 如果您可以提供一些示例类来描述您的情况以及您打算如何使用它们,那么可以创建一个示例。

标签: php oop variables exists


【解决方案1】:

你为什么不使用isset??

if (isset($this->$variable))

【讨论】:

  • 正如我之前所说,这将检查它是否存在于子类或主类中,我希望它只检查子类。
【解决方案2】:

通常情况下有isset() 函数,但不适合这种情况。请改用property_exists()

class Foo
{
    public $pub = null;
}

$obj = new Foo();

var_dump(isset($obj->pub), property_exists('Foo', 'pub')); //false, true

-这是因为如果属性存在,但为 null,isset() 将返回 false - 当它不存在时,您将无法区分大小写。

如果是关于动态属性 - 那么你应该将对象而不是类名传递给property_exists(),因为属性可能在类中不存在,然后动态添加到对象中。

现在,如果我们说 哪个类 正在声明属性,您可以在 PHP 中使用 Reflection,如下所示:

class Foo
{
    public $pub = null;
}

class Bar extends Foo
{
}

$obj = new Bar();

$ref = new ReflectionObject($obj);

var_dump($ref->getProperty('pub')->getDeclaringClass()->getName() == 'Bar');//false
var_dump($ref->getProperty('pub')->getDeclaringClass()->getName() == 'Foo');//true

【讨论】:

  • 与 Shankar 的回答相同,问题不在于我不知道如何检查。我想检查 CHILD 类是否具有该属性。如果 MAIN 类有它,我不希望它返回 true。
  • 似乎很难做到如此简单的事情。 :(
  • 好吧,如果我理解正确的话,你想要上课,也就是声明你的财产。当您对类进行扩展时,它的所有公共和受保护(但不是私有)属性都将继承给子类,除非子类覆盖它们。因此,在子类中,您还将根据定义拥有它们。因此,哪个类声明它们没有区别 - 那是因为您需要使用反射功能来发现这个东西
  • 嗯..我给你举个例子。在我的主类上,我有全局设置器和一些全局方法,如 Save() 等。在子类上,我有 $id、$name、$address 等属性。我想用全局设置器设置这些值。一切正常,但我在主类上有一些变量,如 $db 等,我不想设置。这就是为什么我要检查该属性是否存在于孩子身上,因为它是“可设置的”。
  • 如果是这样,为什么不将$db 设为private 变量?然后孩子不能覆盖它
【解决方案3】:

这对我有用:

if(property_exists($get_class($this),$variable)){}

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2016-12-28
    • 2014-08-01
    • 2021-10-26
    • 2014-06-23
    • 2017-08-05
    • 2010-10-25
    • 2011-12-16
    相关资源
    最近更新 更多