将php变量从类转移到扩展类

时间:2011-11-12 06:23:46

标签: php model-view-controller class

基本上这就是我想要做的事情:

<?php
  class App {
    public $var = "main-class";
    public function load() {
      $this->var =  "child-class";
      $child = new Child;
      $child->echo_var();
    }
  }
  class Child extends App {
    public function echo_var() {
       echo $this->var;
    }
  }

  $app = new Child;
  $app->load();
?>

它输出“main-class”,我希望它输出“child-class”而不必修改子类(因为我希望它是一种“干净”和动态类)。

我接受另一种行动方案的建议

PS:这是我正在努力开发的小型MVC框架的一部分。

3 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。两者都需要使用构造函数。对于第一个,孩子将在创建时声明自己

<?php
class App {
    public $var = "main-class";

    public function __construct($var=null) {
        if($var !== null) {
            $this->var = $var;
        }
    }

    public function load() {
        $child = new Child ();
        $child->echo_var();
    }
}

class Child extends App {
    public function __construct(){
        parent::__construct("child-class");
    }

    public function echo_var() {
        echo $this->var;
    }
}

$app = new Child();
$app->load();
?>

第二个允许父母声明孩子的名字。

<?php
class App {
    public $var = "main-class";

    public function __construct($var=null) {
        if($var !== null) {
            $this->var = $var;
        }
    }

    public function load() {
        $child = new Child ("child-class");
        $child->echo_var();
    }
}

class Child extends App {
    public function echo_var() {
        echo $this->var;
    }
}

$app = new Child();
$app->load();
?>

我相信,这两个例子都能奏效并做你想做的事。

答案 1 :(得分:0)

这不是继承的工作方式 - 通过创建新的Child对象,其数据成员都使用其默认值进行初始化。在父类中执行$this->var = ""时,您要设置$app对象的数据成员,而不是$child对象。

您可以修改子类以包含接受参数的构造函数,并且构造函数将正确设置其数据成员。为了实现类似于你想要的东西,你可以使用构造函数:

<?php
  class App {
    public $var = "main-class";
    public function __construct() {
      $this->var =  "child-class";
    }
    public function load() {
      $child = new Child;
      $child->echo_var();
    }
  }
  class Child extends App {
    public function __construct()
    {
      parent::__construct();
    }
    public function echo_var() {
       echo $this->var;
    }
  }

  $app = new App;
  $app->load();

答案 2 :(得分:0)

我觉得很奇怪你的父班真的是他的孩子。通常,您可以实例化孩子,并获得父母的所有功能。

$app = new Child();
$app->load();

问题是你实际上有2种不同的实例。你有一个App的对象,它拥有一个单独的Child对象。

另一种方法是将$ var作为一个静态变量,然后它将独立于实例化而可用。我通常不建议将属性设置为静态。它通常被认为是不好的形式(出于多种原因)。

相关问题