[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не могу разобраться с __construct
clocwerk
Добрый день господа, вот сегодня разбирался с синглтоном, и вот что обнаружил:

class Test
{

private function __construct() { }

}


class Test1 extends Test
{
public $test;

function __construct($test)
{
$this->test = $test;
}

public function vyvod()
{
echo $this->test;
}
}


$test = new Test1("Конструктор который нельзя переопределить");

$test->vyvod();


Как же так получается, в классе Test конструктор private, а потом в классе Test1 я его спокойно переопределяю... Может я чего то не понимаю... Подскажите плз
P.S. php версии 5.6 может я просто не знаю о каких то изменениях?
depp
а его ли ты переопределяешь?
clocwerk
Цитата
а его ли ты переопределяешь?


Всмысле? Что то я не понимаю, какой тогда вобще смысл в приватных методах? И как тогда работает singleton вот привожу реализацю по которой разбираюсь:


class db {
const HOST = 'localhost';
const LOGIN = 'root';
const PASS = 'pw';
const DB = 'db';
protected static $_instance;

/*
* Приватная функция __construct
* что бы нельзя было наследоваться от этого класса
*/

private function __construct() {
}


/*
* Статический метод getInstance что бы можно было обратиться
* к методу не создавая экземпляра класса
*/

public static function getInstance() {
if (self::$_instance === null) {
self::$_instance = new mysqli(self::HOST, self::LOGIN, self::PASS, self::DB); // HOST и т.д. в данном случае константы
}

return self::$_instance;
}

/*
* Аналогично запрещаем клонирование и восстановление
*/

private function __clone() {
}


private function __wakeup() {
}
}



Что мне тогда мешает унаследовать свой класс от класса db и определить свой __construct?
depp
не знаю откуда это, читай лучше здесь: http://php.net/manual/ru/language.oop5.decon.php
clocwerk
Похоже у меня неправильная реализация singleton`а, не могли бы вы подсказать где взять правильную?
А если еще код с комментами будет, то вобще будет супер
dron4ik
приватные поля не видны наследникам, ты просто создал новый конструктор

_____________
Ex3m.com.ua — Активный образ жизни
clocwerk
Цитата
приватные поля не видны наследникам, ты просто создал новый конструктор


Ну тогда получается что вся суть синглтона вот в этих строчках:

public static function getInstance() {
if (self::$_instance === null) {
self::$_instance = new mysqli(self::HOST, self::LOGIN, self::PASS, self::DB); // HOST и т.д. в данном случае константы
}

return self::$_instance;
}

Все остальное не важно?
depp
по сути да. также необходима защита от дублирования (при помощи __clone() и _wakeup()), а также вызов возможно только через db::getInstance(), объявив пустой __construct().

у вас тема как-то плавно перетекла от __construct() в синглтон.
clocwerk
Аааа, все я понял, приватный пустой construct не позволяет сделать:

$foo = new db();

И по этому можно только вызвать getInstance.
Спасибо! Прям озарение нашло

Цитата
у вас тема как-то плавно перетекла от __construct() в синглтон.

На самом деле, я когда смотрел на синглтон, и задумался над тем почему нельзя сделать так:

class db2 extends db
{
...
}

И поэтому создал простой пример, который потом и выложил на форум
Быстрый ответ:

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