Передача php-переменных из класса в расширенный класс - PullRequest
1 голос
/ 12 ноября 2011

В основном это то, что я хочу сделать:

<?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: Это часть Small MVC Framework, которую я пытаюсь разработать..

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Есть два способа сделать это.Оба будут нуждаться в использовании конструкторов.В первом случае дочерний элемент объявляет себя при создании

<?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();
?>

Второй позволяет родительскому элементу объявить имя дочернего элемента.делай, что хочешь, я верю.

0 голосов
/ 12 ноября 2011

Я нахожу очень странным, что ваш родительский класс указывает, что это ребенок. Как правило, вы создаете экземпляр дочернего объекта и получаете все функции родительского элемента.

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

Проблема в том, что у вас на самом деле есть 2 разных экземпляра. У вас есть объект App, и он содержит отдельный объект Child.

Другой способ сделать это - сделать переменную $ var статической, и тогда она будет доступна независимо от создания экземпляра. Я вообще не рекомендую делать свойства статичными. Обычно это считается плохой формой (по многим причинам).

0 голосов
/ 12 ноября 2011

Это не так, как работает наследование. При создании нового объекта 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...