0

我见过一些标题非常相似的问题,但它们与我的具体问题无关。

基本上,我想在扩展核心的类中从我的核心类访问变量,但与其他示例相比,事情似乎相当复杂。我正在使用 MVC 框架。我已经简化了下面的代码以删除任何不相关的内容。

索引.php

// Load the core
include_once('core.php');
$core = new Core($uri, $curpath);
$core->loadController('property');

核心.php

class Core
{
    public $uri;
    public $curpath;

    function __construct($uri, $curpath)
    {       
        $this->uri = $uri;
        $this->curpath = $curpath;
    }


    // Load the controller based on the URL
    function loadController($name)
    {       
        //Instantiate the controller
        require_once('controller/'.$name.'.php');
        $controller = new $name();
    }


}

属性.php

class Property extends Core
{
    function __construct()
    {
        print $this->curpath;
    }   
}

打印 $this->curpath 什么都不返回。变量已设置,但为空。如果我在 core.php 中打印 $this->curpath ,它会打印得很好。

我怎样才能访问这个变量?

4

3 回答 3

6

你做错了tm

  1. 您应该使用自动加载器,而不是手动将文件包含在每个类中。您应该了解spl_autoload_register()and 和namespaces,以及如何利用它们。

  2. 不要在__construct()方法中生成输出。这是一个非常糟糕的做法

  3. 变量仍然存在。那不是问题。在 PHP 中,当你扩展一个时,它不会继承构造函数

  4. 你不明白继承是如何工作的。当您在扩展类的实例上调用方法时,在调用扩展类的方法之前,它不会执行父类的方法。它们被覆盖,而不是堆叠。

  5. 不应公开对象变量。你正在打破封装。而是将它们定义为public您应该使用protected的 .

  6. 您应该扩展它们的类,它们是不同类型的相同通用事物。extendsPHP 中的意思是is-a。这意味着,当你写 时class Oak extends Tree,你的意思是所有的橡树都是树。同样的规则意味着,在您的理解中,所有Property实例都只是实例的一个特例Core。他们显然不是。

    在 OOP 中,我们有原则。其中之一是Liskov 替换原则(更简短的解释)。这就是你的班级违反的事情。

于 2012-06-20T13:50:11.190 回答
0

我认为问题在于:

如果您考虑像这样的简单继承:

class Dog{
    public $color;

    public function __construct($color){
        $this->color = $color;
    }
}

class TrainedDog extends Dog{
    public $tricks;

    public function __construct($color, $tricks){
        $this->tricks = $tricks;

        parent::__construct($color);
    }
}

//Create Dog:
$alfred = new Dog('brown');

//Create TrainedDog
$lassie = new TrainedDog('golden',array('fetch'));

在这个例子中,$alfred 是一只棕色的狗,而 $lassie 是一只金色的狗。这两个实例彼此分开,唯一的共同点是它们都有一个名为 $color 的属性。

例如,如果您想要一个在所有 Dogs 中都可用的变量,则需要一个类变量:

class Dog{
    public $color;

    public static $numberOfLegs; //Class variable available in every instance of Dog.

    public function __construct($color, $numberOfLegs){
        $this->color = $color;
        self::$numberOfLegs = $numberOfLegs;
    }
}

class TrainedDog extends Dog{
    public $tricks;

    public function __construct($color, $tricks){
        $this->tricks = $tricks;

        parent::__construct($color);

        echo parent::$numberOfLegs;
    }
}

不过,这在很多情况下没有多大意义,因为如果您有两个父类实例(在您的情况下是 Core),它们也共享类变量。

除非您可以确保 Core 只实例化一次,否则这种方法将不起作用。如果它只存在一次,您也可以使用常量变量来存储 2 个属性。

如果存在多个 Core 实例/对象,我建议使用组合(如 Alvin Wong 所建议)。

class Core{
      //Just as you programmed it.
}

class Property{
      private $core;

      public function __construct($core){
          $this->core = $core;

          echo $core->curPath;
      }
}
于 2012-06-20T12:09:43.347 回答
-1

试试这个

include_once('core.php');
$core = new Core('test', 'path');
$core->loadController('property');

class Property extends Core
{
 function __construct($date)
{
    print $date->curpath;
}   
}



class Core
{
public $uri;
public $curpath;

function __construct($uri, $curpath)
{       
    $this->uri = $uri;
    $this->curpath = $curpath;
}


// Load the controller based on the URL
function loadController($name)
{       
    //Instantiate the controller
    require_once($name.'.php');
    $controller = new $name($this);
}


}
于 2012-06-20T11:41:12.080 回答