Код:
abstract class Opa
{
}
class A extends Opa
{
protected $var = 10;
public function getVar()
{
return $this->var;
}
}
class B extends Opa
{
protected $val;
public function __construct()
{
echo $this->var;
}
}
$bojb = new B();
Спустя 3 часа, 24 минуты, 25 секунд (1.06.2012 - 02:45) Invis1ble написал(а):
Ты создаешь объект класса B и в нем нет свойства var. B ничего не знает о A и знать не может в данном случае. Задай свойство в родителе, если хочешь использовать его во всех дочерних классах.
И полиморфизм тут не причем.
И полиморфизм тут не причем.
Спустя 11 часов, 6 минут, 6 секунд (1.06.2012 - 13:51) AlmazDelDiablo написал(а):
Да, видимо я этот момент не понял, когда читал учебник. Спасибо.
Теперь другая ситуация, с которой у меня не получается разобраться.
Есть родительский (class Engine) класс, в нем два метода (loadData() и loadModules()). Первый заполняет пустой массив ($this->arr); второй вызывает дочерний класс (class Mysql extends Engine), в котором этот массив вызывается. Выполняются эти методы именно друг за другом, внутри конструктора родительского класса. Но в результате в дочернем классе тот самый массив оказывается пустым. Может я что-то не так понимаю в плане очередности выполнения методов внутри конструктора? Так как есть массив задать непосредственно в самом начале класса Engine (public $arr = array( '1' => 'one' );), то он передается в дочерний.
Код:
Результат работы:
Теперь другая ситуация, с которой у меня не получается разобраться.
Есть родительский (class Engine) класс, в нем два метода (loadData() и loadModules()). Первый заполняет пустой массив ($this->arr); второй вызывает дочерний класс (class Mysql extends Engine), в котором этот массив вызывается. Выполняются эти методы именно друг за другом, внутри конструктора родительского класса. Но в результате в дочернем классе тот самый массив оказывается пустым. Может я что-то не так понимаю в плане очередности выполнения методов внутри конструктора? Так как есть массив задать непосредственно в самом начале класса Engine (public $arr = array( '1' => 'one' );), то он передается в дочерний.
Код:
<?php
class Engine
{
/* Задаем пустой массив */
public $arr = array();
static private $instance = null;
/* Реализация синглтона */
static public function createInstance()
{
if( empty( self::$instance ) ) {
self::$instance = new self();
}
}
/* Конструктор */
private function __construct()
{
$this->loadData();
$this->loadModules();
}
/* Заполнение массива */
private function loadData()
{
$this->arr = array( '1' => 'one' );
}
/* Подключение дочернего класса */
private function loadModules()
{
$this->libs['Mysql'] = Mysql::getInstance();
$this->libs['Mysql']->setConnect();
}
}
class Mysql extends Engine
{
static private $instance = null;
/* Реализация синглтона */
static public function getInstance()
{
if( empty( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {}
/* Выводим массив родительского класса */
public function setConnect()
{
print_r( $this->arr );
}
}
Engine::createInstance();
exit();
?>
Результат работы:
Array ( )
Спустя 2 часа, 9 минут, 33 секунды (1.06.2012 - 16:00) Invis1ble написал(а):
public static $arr = array();
/* Заполнение массива */
private function loadData()
{
self::$arr = array( '1' => 'one' );
}
// ...
/* Выводим массив родительского класса */
public function setConnect()
{
var_dump(parent::$arr);
}
Спустя 15 минут, 49 секунд (1.06.2012 - 16:16) AlmazDelDiablo написал(а):
Такой вариант я знаю, но вообще думал, что подобное делается без static переменных. Ибо через статические можно и вообще без наследования делать, просто обращаться напрямую к Engine.
Спустя 7 часов, 17 минут, 36 секунд (1.06.2012 - 23:34) Dezigo написал(а):
В этом кусочке вы создаёте обсалютно новый объект и он не содержит массив
И вообще я могу сказать, что это не правельное проектирование., так как класс с базой должен быть не зависим ,а не наоборот.
$this->arr.
$this->libs['Mysql'] = Mysql::getInstance();
И вообще я могу сказать, что это не правельное проектирование., так как класс с базой должен быть не зависим ,а не наоборот.
Спустя 1 час, 15 минут, 56 секунд (2.06.2012 - 00:50) AlmazDelDiablo написал(а):
Моя... Эм... Если можно так выразиться «модель» выглядит так:
Класс Engine загружает все конфиги и модули движка. Дальше уже каждый модуль, выбирая необходимые ему настройки из Engine, настраивает сам себя, скажем так.
Посоветуйте, где можно почитать чистую теорию про ООП, ибо на ПХП-сайтах я нахожу только непосредственно функции для работы с классами / паттерны / статьи о том, что ООП не нужно, а полноценного описания «как же обычно проектируют движки на ООП» пока не попадалось.
Класс Engine загружает все конфиги и модули движка. Дальше уже каждый модуль, выбирая необходимые ему настройки из Engine, настраивает сам себя, скажем так.
Посоветуйте, где можно почитать чистую теорию про ООП, ибо на ПХП-сайтах я нахожу только непосредственно функции для работы с классами / паттерны / статьи о том, что ООП не нужно, а полноценного описания «как же обычно проектируют движки на ООП» пока не попадалось.
Спустя 12 часов, 55 минут, 49 секунд (2.06.2012 - 13:46) Dezigo написал(а):
Ну так возьмите любой framework и разберите его., а не делайте наследования всех классов от Engine.
Спустя 11 часов, 22 минуты, 36 секунд (3.06.2012 - 01:08) AlmazDelDiablo написал(а):
Не знаю как вам, а мне очень тяжело дается разбирать чужой код. Пробовал смотреть фреймворк Кохану, движки пхпББ-3, ИПБ, ЛайвСтрит, но спустя три часа лазанья по коду и изучения местных функций я совершенно теряюсь и не понимаю, как оно работает. Мне куда проще прочитать абстрактную теорию с простейшими примерами и поэксперементировать самому.
Спустя 18 часов, 23 минуты, 24 секунды (3.06.2012 - 19:32) Dezigo написал(а):
Вам не нужно заучивать функций, а просто посмотреть принцип работы
http://irbis-team.com/15/4
http://habrahabr.ru/post/68093/

http://irbis-team.com/15/4
http://habrahabr.ru/post/68093/
Спустя 1 час, 56 минут, 45 секунд (3.06.2012 - 21:28) vital написал(а):
И тут эти пони на аватарках(
_____________
Блог | VK | GitHub | Twitch