Доступ к объекту из дочернего класса - PullRequest
0 голосов
/ 08 января 2011

Итак, у меня есть следующий класс:

class db {
    function __construct() { ... }
}

и я могу создать его таким образом: $db = new db();

У меня есть другой класс - основной класс, который формирует основу моего приложения. Давайте назовем это главным:

class main {
    public $var1;
    public $db;

    function __construct() {
        $this->db = new db();
        $this->start();
    }

    function start() {
        $child = new child();
    }
}

После инициализации объекта базы данных я хочу вызвать мой дочерний класс (который является расширением main, например так:

class child extends main {
    function __construct(){
        echo parent::$var1; // Prints whatever is in $var1
    }

    function doSomething(){
        parent::$db->runQuery(); // Doesn't work
    }
}

Однако это не работает. Очевидно, что я могу просто объявить свой $db объект вне моего основного класса и использовать global $db;, чтобы снова поднять его в дочернем объекте, но я бы предпочел этого не делать (поскольку это означает наличие этой строки в каждой функции, использовать объект базы данных).

Как я могу просто сделать мой $db объект доступным для дочерних классов?

Ответы [ 4 ]

1 голос
/ 08 января 2011

На данный момент $db доступен везде, где у вас есть доступ к экземпляру класса, потому что вы определили его как public. Он также наследуется для всех дочерних классов, что означает, что вы можете использовать $this вместо parent здесь. Вы также можете объявить его protected, что, вероятно, даже лучше для инкапсуляции.

Ссылка на родительскую переменную напрямую является плохой идеей (и, во всяком случае, невозможной в PHP), потому что одной из основных функций ОО является наследование и возможность переопределить родительский объект при необходимости.

Вы обязательно должны прочитать о Наследование и Инкапсуляция в объектно-ориентированном программировании.

1 голос
/ 08 января 2011

Поскольку «child» расширяет «main», теперь в нем есть члены «main».Таким образом, доступ к свойствам будет локальным с помощью оператора стрелки, как сказал Джона Брон.

class child extends main {
    function __construct(){
        echo $this->$var1;
    }

    function doSomething(){
        $this->db->runQuery();
    }
}

Класс наследует методы и свойства от своего родителя, но конструктор родителя не запускается автоматически.Вы ищете доступ к объекту 'db', но он не был создан.Вы можете вручную запустить конструктор родителя, используя parent::__construct(), но имейте в виду, что ваш код в настоящий момент сгенерирует бесконечный цикл создания экземпляров, так как вы создаете дочерний элемент внутри его родителя.

1 голос
/ 08 января 2011

Дочерний объект наследует все атрибуты и методы от родительского.Это будет работать:

class child extends main {
    function __construct(){
        parent::__construct();
        echo $this->var1; // Prints whatever is in $var1
    }

    function doSomething(){
        $this->db->runQuery(); // Doesn't work
    }
}
0 голосов
/ 25 июля 2013

Посмотрите на это с точки зрения ООП: у вас есть классная птица и классный орел.Орел это птица, но не каждая птица это орел.Это сказанное, если кто-то использует объект птицы, вы ожидаете только птицу, не больше.Таким образом, внутри птичьего класса должна быть нет ссылка для вызывающего класса или любого подкласса.Более того, суперкласс не знает, кто его называет.Разрешено знать только себя, суперкласс, реализованные интерфейсы и другие классы, используемые для выполнения этого упражнения.Эти другие классы не включают подклассы.

Пользователь Eagle ожидает Eagle.Так что этот пользователь ожидает всего, что есть у птицы, плюс еще кое-что.Но это создает объект орла.Таким образом, орел несет ответственность за правильную инициализацию.Поэтому конструктор Eagle вызывает родительский конструктор как самое первое.

<?php
class Bird {
    protected $var1 = '';
    protected $db = null;

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

class Eagle extends Bird {
    public function __construct(){
        parent::__construct();
        echo $this->var1;
    }

    public function doSomething(){
        $this->db->runQuery();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...