Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Не могу разобраться с __construct
clocwerk  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 36
Пользователь №: 41868
На форуме: 1 год, 2 месяца, 16 дней
Карма: 1




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

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 может я просто не знаю о каких то изменениях?

Это сообщение отредактировал clocwerk - 5.02.2016 - 16:16
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 299
Пользователь №: 40589
На форуме: 2 года, 7 дней
Карма: 20




а его ли ты переопределяешь?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
clocwerk  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 36
Пользователь №: 41868
На форуме: 1 год, 2 месяца, 16 дней
Карма: 1




Цитата
а его ли ты переопределяешь?


Всмысле? Что то я не понимаю, какой тогда вобще смысл в приватных методах? И как тогда работает 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?
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 299
Пользователь №: 40589
На форуме: 2 года, 7 дней
Карма: 20




не знаю откуда это, читай лучше здесь: http://php.net/manual/ru/language.oop5.decon.php
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
clocwerk  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 36
Пользователь №: 41868
На форуме: 1 год, 2 месяца, 16 дней
Карма: 1




Похоже у меня неправильная реализация singleton`а, не могли бы вы подсказать где взять правильную?
А если еще код с комментами будет, то вобще будет супер

Это сообщение отредактировал clocwerk - 5.02.2016 - 16:32
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
dron4ik  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1690
Пользователь №: 31058
На форуме: 4 года, 11 месяцев
Карма: 24




приватные поля не видны наследникам, ты просто создал новый конструктор


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
clocwerk  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 36
Пользователь №: 41868
На форуме: 1 год, 2 месяца, 16 дней
Карма: 1




Цитата
приватные поля не видны наследникам, ты просто создал новый конструктор


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

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

return self::$_instance;
}

Все остальное не важно?
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 299
Пользователь №: 40589
На форуме: 2 года, 7 дней
Карма: 20




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

у вас тема как-то плавно перетекла от __construct() в синглтон.
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
clocwerk  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 36
Пользователь №: 41868
На форуме: 1 год, 2 месяца, 16 дней
Карма: 1




Аааа, все я понял, приватный пустой construct не позволяет сделать:

$foo = new db();

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

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

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

class db2 extends db
{
...
}

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

Это сообщение отредактировал clocwerk - 5.02.2016 - 17:47
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса