Получение данных из других классов при расширении - PullRequest
0 голосов
/ 21 марта 2011

Прежде всего, я очень плохо знаком с ООП, и я борюсь с большим трудом. У меня есть вопрос о текущем дизайне моего приложения и наследовании.

У меня есть файл начальной загрузки, который запускает все мои основные классы, после их включения, например:

$security = new Security;
$error_handler = new ErrorHandler;
$application = new Application;
$mysql = new MySQL;
$template = new Template;
$user = new User;

Сначала я загружаю классы Security и ErrorHandler, потому что они нужны классу Application в первую очередь (выдают пользовательские ошибки 404, делают переменные GET безопасными и т. Д.). Теперь все классы расширяют класс Application, но я не могу вызвать какие-либо данные в каком-либо классе из дочернего или родительского класса.

Я прочитал, что мне нужно сначала вызвать конструктор родительского класса, чтобы использовать любые данные. Это не очень сексуально и бесполезно в моих глазах, и я не вижу смысла использовать extends тогда.

Должен ли я изменить дизайн? Или как я могу использовать данные из одного класса в другой? Я уже пробовал композицию, но это оказалось кошмаром, потому что я вообще не мог использовать данные разных дочерних классов.

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

В любом случае, это странная настройка. Вам определенно НЕ следует использовать некоторые функции начальной загрузки для предварительной загрузки ваших классов, особенно если некоторые классы имеют конечные зависимости от других классов. Что было бы немного лучше, это:

Ваши классы Security и ErrorHandler должны использовать либо статические методы, чтобы позволить использовать их функциональные возможности без объявления класса, либо они должны быть созданы как класс var класса Application.

class Security {
    // can be invoked anywhere using Security::somefunction('blah');
    public static somefunction($somevar) { ... }
}

ИЛИ

require_once('security.php');
require_once('errorhandler.php');

class Application {
    public $security;
    public $errorHandler;
    public function __construct() {
        $this->security = new Security;
        $this->errorHandler = new ErrorHandler;
    }
}

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

require_once('application.php');
class User extends Application {
    public function throwError($message) {
        return $this->errorHandler->somefunction($message);
    }
}

Без явного объявления $this->errorHandler внутри класса User, это все равно должно работать, так как класс $errorHandler var объявлен в классе Application.

0 голосов
/ 22 марта 2011

Если у вас есть дочерний класс, который определяет метод __construct(), и вы хотите, чтобы его родительский метод __construct() вызывался, метод __construct() дочернего класса должен вызывать родительский метод.

Так в PHP ;это то, что вы должны сделать;не большой выбор.


В качестве ссылки, цитируя раздел Конструкторы и деструкторы руководства:

Родительские конструкторы не вызываются неявно, если дочерний класс определяет конструктор.Для запуска родительского конструктора требуется вызов parent::__construct() внутри дочернего конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...