【问题标题】:PHP: Extending ClassesPHP:扩展类
【发布时间】:2017-01-09 01:59:18
【问题描述】:

我绝对确定以前有人问过这个问题,但我在任何地方都找不到。

所以我有两节课。甲和乙

class classA 
{ 
    public $var1;
    public $classbVar;
    public function init()
    {
        // This is here because other script is run before it is called
        // in the live code.
        // it basically checks that the file exists. There is a reason for this.
        if (file_exists('classB.php')) 
        {
            require_once('classB.php');
        }
        else
        {
            echo "An error has occurred loading the second class.";
        }
        $this->var1 = "something";
        $this->classbVar = new classB
        echo $this->classbVar->doSomething();

    }
}

在一个单独的文件中

class classB extends classA
{
     public function doSomething()
     {
          echo $this->var1;
     }
 }

在第三个文件中,我正在调用 classA 并运行 init 函数。这不是真正的代码,但和我写的一样。

那么为什么这不起作用。如果我 VAR_DUMP 我得到 null.... 我做错了什么或误解了什么?

让我更清楚:

还有第三个文件调用 classA 如下;

require_once('classA.php')
$classA = new classA;
$classA->init();

对于任何混淆,我深表歉意,我在飞行中做了一点,因为我确信我在这里遗漏了一些简单的东西。当然,我尝试这样做的方式会以某种方式起作用。

【问题讨论】:

  • 失败的具体代码是什么样的?
  • 基本上这个....require_once (classA.php); $classA = new classA(); $classA->init();
  • 确切的代码超过 500 行,由于扩展无法正常工作,或者至少不像我预期的那样,它会绊倒。它也跨越 6 个文件,从开始到出现问题。到目前为止一切都很好,但这是我第一次玩扩展类,我是在程序上长大的,并且可以做得很好,但是类显然更好,将来更容易修改

标签: php class extends


【解决方案1】:

这里有两个问题导致您的输出为空:

  1. 您正在生成一个新的$classA 对象,并且您在该对象上设置的任何值都不会自动设置在$classbVar 对象上,因为这是一个完全不同的类对象,它只是扩展了A 类,不是您刚刚生成的 $classA 对象。
    当然除了静态属性...
  2. 如果你想在一个对象中设置一个属性的值,你需要$this->var1而不是$var1
    注意如果您在 $classA 对象中设置了值,它仍然没有为 $classbVar 对象设置。

【讨论】:

  • 所以这与我当时的理解完全相反。整个继承不是一次调用第二个类,而是从第二个类到第一个类。
  • @ukitconsultant 某个类的对象继承了它扩展的 class 的特征,但它没有从另一个 object 继承任何内容。在扩展同一个类的类中生成一个对象确实会让事情有点混乱:-)
  • 那么你如何在类之间传递值呢?我是否在这里错过了一些完全愚蠢的事情。
  • @ukitconsultant 您不要在类之间传递值:扩展类的对象只是继承其父类的属性和方法,因此您可以将它们当作同一个类的一部分来使用。
  • 那么如何在不完全脱离类的情况下将数据从一个类传递到另一个类?
【解决方案2】:
  1. 将 require_once 放在类声明之上(这不是大问题,但更清楚)
  2. 将变量分配给类属性,因为它们按照您的方式执行,它们的范围仅在方法内。

    $var1 = "something";

应该改为

    $this->var1 = "something";

除非声明为静态,否则类值也不共享。因此,要从父类访问属性,您可以执行以下操作:

class classA 
{ 
    public $var1;

    public function init()
    {
        $this->var1 = "something";
    }
}

// other file
require_once("A class location");

class classB extends classA
{
     public function doSomething()
     {
          echo $this->var1;
     }
}

$b = new classB();
$b->init();
$b->doSomething();

或更干净的方式:

class A 
{ 
    protected $var1;

    public function __construct()
    {
         $this->var1 = "something";
    }
}

// other file
require_once("A class location");

class B extends A
{
     public function doSomething()
     {
          return $this->var1;
     }
}

$b = new B();
echo $b->doSomething();

// or shorter syntax

echo {new B()}->doSomething(); 

最好使用PSR-4 autoloader,而不是使用require_once()

【讨论】:

    猜你喜欢
    • 2012-06-27
    • 2012-07-31
    • 2013-02-06
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多