[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с наследием в ООП
Universium
Доброго времени суток!

Пишу код, столкнулся с проблемой наследия...
есть у меня главный класс kernel, который потом наследуют другие классы... В этом классе есть некие методы и свойства.


class kernel{
public $config;
function __construct(){
$this->config[0] = 1;
}
function addConf() {
$this->config[1] = 2;
$this->config[2] = 3;
$this->db = new mysql;
$this->db->connect();
}
}



как видите, при инициализации класса кернел публичному свойству $config типа array присваивается некое значение.

далее мы вызываем метод addConf и тут начинаются проблемы... в классе mysql имеется следующий код:


class mysql extends kernel{
function connect(){
print_r($this->config);
}
}



на вывод идёт только array(0 => '1'), хотя я в config 3 значения на момент создания объекта класса mysql. Если все 3 значения вбивать в config именно в методе __construct то все 3 значения будут доступны в mysql.

Может я упустил какой-то момент ООП? Раньше не сталкивался с такой проблеммой, работал с готовым другим движком, тут понадобилось создать приложение с 0 и запоролся на данном этапе.

Код приведён для примера, просто в реальносте он пообширней будет :)



Спустя 10 минут, 46 секунд (3.09.2011 - 22:06) VolDroN написал(а):
или до меня не доходит, или вы что то мудрите)
а где вызов addConf()? Вы же прописываете конфигу только один ключ.
Если надо всё заполнить то в конструкторе, например, можно вызвать $this->addConf();

Спустя 7 минут, 57 секунд (3.09.2011 - 22:14) Universium написал(а):
VolDroN, Извините, вечер просто, устал уже.


$kernel = new kernel;
$kernel->addConf();


отак допустим идёт вызов... То что делалось в конструкторе в mysql доступно... то что уже после вызова $kernel->addConf() - не доступно, хотя свойство config в классе kernel публичное.

Тоесть мне нужно писать просто:



$kernel = new kernel;


а конструктор пускай уже тянет за собой всё остальное?

Спустя 2 минуты, 37 секунд (3.09.2011 - 22:16) kirik написал(а):
Universium
Всё верно. mysql наследует kernel, причём наследует не созданный объект, а класс. Тоесть при создании mysql создаётся новый, ещё один объект kernel (девственно чистый).
Если нужно чтобы свойство config было общее для всех инстанций класса, то объявите его как static.

Спустя 12 минут, 24 секунды (3.09.2011 - 22:29) Universium написал(а):
kirik, :) или мне пора идти спать или пора выкинуть мозг мой :(

я объявляю config как статик:


class kernel{
static $config;
...

}


то если определять в addConf чему будет равно это свойство, то при вызове в классе mysql вылазит ошибка:


Notice: Undefined property: mysql::$config in...


ну а если в конструкторе придать значение какое-то, то оно выводится... :( что-то я криворукий. Или же я не понял о чём вы

Спустя 27 минут, 4 секунды (3.09.2011 - 22:56) kirik написал(а):
Universium
Если свойство статичное, то к нему нужно обращаться не через ->, а через ::.
Тоесть вам нужно заменить $this->config на self::config.


UPD
Вот код для примера:
class C1 {
public static $config = array();

public function __construct() {
self::$config[] = 1;
}

public function foo() {
self::$config[] = 2;
$this->db = new C2;
$this->db->bar();
}
}


class C2 extends C1 {
public function bar() {
print_r(self::$config);
}
}


$v = new C1();
$v->foo();

/*
Результат:
Array
(
[0] => 1 // добавляется при создании new C1
[1] => 2 // добавляется при вызове C1->foo()
[2] => 1 // добавляется при создании new C2 (т.к. конструктор C1->__construct() вызывается ещё раз)
)
*/


Вообще, класс mysql не логично наследовать от kernel. Ибо это не правильно. В природе это примерно как наследовать Автомобиль от... например от спичечного коробка :)

Спустя 10 минут, 36 секунд (3.09.2011 - 23:07) Universium написал(а):
kirik, ок, спасибо, сейчас буду разбираться.


Спасибо, заработало, только всё же сам понимаю, что как-то криво это всё =/

Спустя 9 минут, 26 секунд (3.09.2011 - 23:16) kirik написал(а):
Цитата (Universium @ 3.09.2011 - 16:07)
только всё же сам понимаю, что как-то криво это всё =/

кернел оставьте кернелом. mysql наследуйте от базового класа db (который будет включать в себя базовые свойства и методы, общие для любого из драйверов БД). А вообще лучше наследовать mysqli и переходить уже на его использование.

Спустя 6 минут, 15 секунд (3.09.2011 - 23:22) Universium написал(а):
А вообще лучше класс db не наследовать от кернела, а передать ему необходимые конфигурации? так тогда прийдётся внутри класса db для некоторых методов писать global $kernel; что бы візвать некие методы? Палка в двох концах... даже в трёх, ибо составить правильно архитектуру всего этого сложновато получается sad.gif

Спустя 4 минуты, 18 секунд (3.09.2011 - 23:26) kirik написал(а):
Цитата (Universium @ 3.09.2011 - 16:22)
А вообще лучше класс db не наследовать от кернела, а передать ему необходимые конфигурации?

Так точно.

Цитата (Universium @ 3.09.2011 - 16:22)
так тогда прийдётся внутри класса db для некоторых методов писать global $kernel; что бы візвать некие методы?

Зачем? Почитайте про паттерн "синглтон" (например тут).

Спустя 26 минут, 15 секунд (3.09.2011 - 23:53) Universium написал(а):
Спасибо за помощь. Позадалбую уже на счёт архитектуры проэкта сотрудника на работе после выходных smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.