【问题标题】:Require()'ing a Class to use in InheritanceRequire()'ing 一个要在继承中使用的类
【发布时间】:2014-09-04 16:52:40
【问题描述】:

我在这里只有一个简单的问题...我正在为我的网站开发一个论坛应用程序,并且在更新我使用的一些旧方法时(我的旧代码很糟糕)我遇到了 - 不是第一次时间 - OOP 设备。

我的系统使用了很多类,并且一遍又一遍地为它们重新定义相同的函数,所以我决定创建一个能够承载这些功能的基类。

我一直在尝试在基类上使用require(),然后扩展它的类...

<?php
require(//path to base class);

class User extends BaseClass {
// code
}
?>

但我不知道如何检查它是否存在,并且它似乎没有继承基类的唯一功能......

public function __get($what) {

if(property_exists($this, $what)) {

return $this->{$what};

} else {

return null;

}

}

因为当我尝试从 User 类(例如 $user-&gt;Username)中检索变量时,它返回 NULL。该变量在类中标记为private,但在我尝试进行继承之前,这不是问题。

【问题讨论】:

  • 如果require 未能添加您的文件,它无论如何都会停止脚本,不是吗?问题是什么 ?您不确定 BaseClass 是否在您需要的文件中?
  • 好吧,我想更清楚一点,我的问题是我最后提到的;我在 BaseClass 中定义的 __get 不像我在 User 中定义它时那样工作。我不确定是不是因为它在继承中不起作用,或者从 require()'d 类继承是否有问题。
  • 我怀疑你的 BaseClass 中有一个变量 $Username?那么你应该让它受到保护。私有变量只对实际类可见,protected 对扩展类也是可见的。
  • @Splashsky 问题至少与require 无关
  • @user3535256 这实际上是有道理的。不,所有的变量都在 User 中,BaseClass 唯一拥有的是__get 函数。

标签: php class object inheritance


【解决方案1】:

听起来你想在你的父类中获取你的变量,但不想使用 getter 方法来做到这一点。标记这些变量protected 确实将允许您的子类访问这些属性,但如果您希望您的基类在设置/获取之前强制执行处理,则标记属性protected 不会削减它。

在您的情况下,听起来您将变量标记为protected 作为解决方法。但是,您仍然可以在基类中使用 private 变量,并允许在子类中访问它们,如下所示:

class BaseClass
{
    private $strValue = "We the people....";

    public function __get($what)
    {
        if(isset($this->{$what})) {
            return $this->{$what};
        }
        return null;
    }
}

class ChildClass extends BaseClass
{
    private $intValue = 255;

    public function __get($what)
    {
        if(isset($this->{$what})) {
            return $this->{$what};
        } else if(parent::__get($what) != null) {
            return parent::__get($what);
        }
        return null;
    }
}

//Try it out
$child = new ChildClass();
var_dump($child->strValue); //"We the people...."
var_dump($child->intValue); //255

在此示例中,BaseClass 使用__get() 魔术方法来查找自己的属性,ChildClass 覆盖它以执行相同的操作。在ChildClass 中,如果它找不到请求的属性,那么它会转向父版本。

只要您不覆盖您的属性,您就可以在整个过程中使用私有变量并访问它们就好像它们在您的类范围之外是公共的。

【讨论】:

    【解决方案2】:

    只需使用 class_exists() 以确保您的班级在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多