Когда уже наконец выйдет PHP5.3 ?

Статус
В этой теме нельзя размещать новые ответы.

cDLEON

Онанист РНРСlub
Когда уже наконец выйдет PHP5.3 ?

Ну вот что за хрень:
Имеется класс:
PHP:
abstract class singleton {
 protected static $instance;
 abstract public function get_instance($instance=NULL);
}
abstract class blabla extends singleton{
 public static function init($var) {
  $obj=self::get_instance();
  //...
 }
}
class child_blabla extends blabla {
 public static function get_instance($instance=NULL) {
  //...
  if(!isset(self::$instance) {
    //...
  }
  return self::$instance;
 }
}
child_blabla::init('asd');
В итоге - ругается примерно так:
Fatal error: Cannot call abstract method singleton::get_instance() in blabla.php on line 22
В итоге - ни чего умного на ум не пришло, кроме как метод init() сделать не статичным.
Но тогда не понятно каким мокаром теперь инитить объект в разные положения, не написав дополнительных строчек в коде, не связанном с библиотекой? Метод которого наследуется...
Уже блин, вроде, смирился с тем, что для синглтона приходится в каждом отдельном классе писать по функции...
Но это вообще через чур....
На последок- вопрос - как бы вы поступили в вышеизложенной мною ситуации...
ЗЫ. Чорд, хотел в оффтоп запостить 8)
ЗЫ.ЗЫ Менять архитектуру - это понятно, но как её лучше изменить ? Ваши мнения...
 

x-yuri

Новичок
Принцип подстановки Лискоу (Liskov Substitution Principle) – дочерние классы можно использовать через интерфейсы базовых классов без знания о том, что это именно дочерний класс. Иначе – дочерний класс не должен отрицать поведение родительского класса и должна быть возможность использовать дочерний класс везде, где использовался родительский класс.
зачем тебе здесь нужно наследование? это типа наследование реализации? не используй его в таком ключе ;-)
 

HraKK

Мудак
Команда форума
Как по мне extend Singleton - это кретенизм.
Максимум что я пойму - implement Singleton
 

cDLEON

Онанист РНРСlub
HraKK
Критинизм - возможно, только делалось это для того, что бы не копипастить каждый раз код этой функции. И в 5.3 это будет возможно. Так что...На мой взгяд, это не критинизм, а ленивость писать каждый раз метод для синглтона....который всегда одинаковый...
x-yuri
зачем тебе здесь нужно наследование? это типа наследование реализации? не используй его в таком ключе ;-)
Нет, этим я хотел достичь полиморфизма этого класса.
И убрать весь ненужный копипаст.
 

x-yuri

Новичок
Нет, этим я хотел достичь полиморфизма этого класса.
+1
а в чем полиморфизм собственно?

И убрать весь ненужный копипаст.
-1
надо помнить, что копипаст - не единственный фактор, и избавляясь от копипаста ты создаешь себе другие проблемы

-~{}~ 10.01.09 03:05:

если ты хотел добиться полиморфизма, то есть два варианта: 1) в классах должен быть определнный набор методов/свойств, 2) классы должны реализовать некоторый интерфейс
 

cDLEON

Онанист РНРСlub
x-yuri
а в чем полиморфизм собственно?
Этот статический метод - служит передатчиком пары параметров внутрь. Т.е. сначала идёт инит объекта, потом присваивание пары переменных и вызов пары методов, которые могут повлиять на объект для каждого наследника по-своему.
А сам метод я использую как замену
$instance=child_blabla::get_instance();
$instance->var1=$var;
Т.е. как бы заменяю конструктор....
надо помнить, что копипаст - не единственный фактор, и избавляясь от копипаста ты создаешь себе другие проблемы
Какие проблемы я бы получил, имея в своём арсенале динамическую self ? В данном случае убирание копи-паста только играет на руку...

-~{}~ 10.01.09 04:21:

классы должны реализовать некоторый интерфейс
на данный момент больше склоняюсь к абстрактным классам с парой абстрактных методов - удобнее рефакторить...

-~{}~ 10.01.09 04:30:

Очень хотелось бы услышать мысли как сделать малой кровью нечто, описанное мной в последнем сообщении..
 

x-yuri

Новичок
Какие проблемы я бы получил, имея в своём арсенале динамическую self ? В данном случае убирание копи-паста только играет на руку...
дело не в динамическом self, а в наследовании, которое является более сильной связью по сравнению с композицией

Этот статический метод - служит передатчиком пары параметров внутрь. Т.е. сначала идёт инит объекта, потом присваивание пары переменных и вызов пары методов, которые могут повлиять на объект для каждого наследника по-своему.
А сам метод я использую как замену
$instance=child_blabla::get_instance();
$instance->var1=$var;
Т.е. как бы заменяю конструктор....
не знаю, может тебе это понятно (как автору), а мне - нет. Может пример приведи конкретный?

на данный момент больше склоняюсь к абстрактным классам с парой абстрактных методов - удобнее рефакторить...
с парой абстрактных методов и парой неабстрактных? Зачем такие сложности тогда. Сделай обычный класс и не добавляй в него абстрактные методы
 

HraKK

Мудак
Команда форума
late state binding в PHP 5.3 нарушение норм ООП.

Следуйщим шагом я уже чувствую будет тема "ну что за нах, когда уже будет возможно множественное наследование" когда тебе понадобиться к занаследовать к Singleton'у еще один класс.
 

x-yuri

Новичок
флоппик статические классы - нарушение норм ООП? почему?
 

cDLEON

Онанист РНРСlub
late state binding в PHP 5.3 нарушение норм ООП.
Т.е. в норм. ООП объект не может наследовать статический метод ?
А если и наследует, то не должен знать имя наследника, из которого этот метод вызывается?
не знаю, может тебе это понятно (как автору), а мне - нет. Может пример приведи конкретный?
Пожалуйста:
PHP:
abstract class singleton {
 protected static $instance;
 abstract public function get_instance($instance=NULL);
}
abstract class blabla extends singleton{
 protected $var;
 protected $options;
 public static function init($var) {
  $obj=self::get_instance();
  $obj->var=$var;
  $obj->options=$this->get_options();
  return $obj;
 }
 abstract function get_options();
}
class child_blabla extends blabla {
 public static function get_instance($instance=NULL) {
  //...
  if(!isset(self::$instance) {
    //...
  }
  return self::$instance;
 }
 public function get_options() {
  return array('blablabla');
 }
}
$child=child_blabla::init('asd');
Вызов get_options, естественно, схематичен. Там лежит более сильная логика у меня.

-~{}~ 10.01.09 15:58:

с парой абстрактных методов и парой неабстрактных? Зачем такие сложности тогда. Сделай обычный класс и не добавляй в него абстрактные методы
Какие сложности ? По-сути получается расширенный интерфейс который может иметь с своём наборе собственную логику, которую не нужно будет разносить по потомкам...Это разве плохо ?

-~{}~ 10.01.09 16:06:

Следуйщим шагом я уже чувствую будет тема "ну что за нах, когда уже будет возможно множественное наследование" когда тебе понадобиться к занаследовать к Singleton'у еще один класс.
А зачем потомку, который наследует логику не синглтона, синглтон? )
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Т.е. в норм. ООП объект не может наследовать статический метод ?
Обьект не может наследовать функцию, коей, по сути и является статический метод.
Статические классы, это «эмуляция» синглтона. Точнее неймспейсов.
Нету их в «классическом» ООП. И не может быть.
 

x-yuri

Новичок
Какие сложности ? По-сути получается расширенный интерфейс который может иметь с своём наборе собственную логику, которую не нужно будет разносить по потомкам...Это разве плохо ?
чтобы не нужно было логику по потомкам разносить обычно композицию используют

Какие сложности ? По-сути получается расширенный интерфейс который может иметь с своём наборе собственную логику, которую не нужно будет разносить по потомкам...Это разве плохо ?
тем самым ты связывашь свой абстрактный класс с потомками. Если бы ты использовал композицию, то связь была бы слабее

а у тебя что, иерархия синглтонов?

что-то похоже что вся эта иерархия для того, чтобы потомки унаследовали общую реализацию. Т.е. это сродни множественному наследованию

Уже блин, вроде, смирился с тем, что для синглтона приходится в каждом отдельном классе писать по функции...
так тебе же надо для каждого класса один объект? тебе тут статическое связывание помешало?

-~{}~ 10.01.09 16:05:

Нету их в «классическом» ООП. И не может быть.
флоппик а что такое «классическом» ООП и где про него почитать?

-~{}~ 10.01.09 16:09:

Статические классы, это «эмуляция» синглтона. Точнее неймспейсов.
это не эмуляция, синглтона и тем более неймспейсов. Не видел синглтонов реализованных с помощью полностью статических классов. Это та самая причина, почему статические классы нарушение норм ООП?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Не видел синглтонов реализованных с помощью полностью статических классов.
Ститический класс и есть синглтон, ващета, за одним минусом —_он не имеет конструктора, а потому — не обьект.
В «классическом» ООП, есть классы, которые являются, по сути ТИПАМИ ДАННЫХ(в терминах процедурного программирования) И есть объекты — в сответствующих терминах, это переменные, того типа, которым является класс (типа Record в паскалевых языках). А теперь представь себе, что у тебя какой нибудь integer попытается действовать как переменная, и иметь какое нибудь, например, значение. Это будет абсурдом, правильно? Так и статический класс, это тип данных, пытающийся не ОПИСАТЬ, а РЕАЛИЗОВАТЬ какие то данные, или действия. Что есть абсурд.
это не эмуляция, синглтона и тем более неймспейсов.
Хорошо. Назови мне РАЗНИЦУ между статическим классом, и неймспейсом, в котором хранится несколько переменных, и несколько функций.

-~{}~ 10.01.09 20:28:

а что такое «классическом» ООП и где про него почитать?
Отметь тут кавычки. Классического определения ООП, не сущаествует, к сожалению. Но есть некоторые основополагающие принципы. Почитать можно Буча, Э. Гамму(как и всю банду четырех, как вместе, так и по отдельности), Алана Кея читать не предлагаю ))
 

x-yuri

Новичок
Ститический класс и есть синглтон, ващета, за одним минусом —_он не имеет конструктора, а потому — не обьект.
в общем по поводу неймспейсов, синглтонов и статических классов: можно и разницу назвать и сказать, что статический класс - не сингтон. Но это все мелочи
 

x-yuri

Новичок
а неймспейсы в php будут позволять содержать вызовы функций, методов?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
<?php
$a = namespace\\function($arg);
$b = namespace\\$variable * 2;
?>
эээ.. там в примере, слеши в разделителях неймспейса, но их форум порезал.

-~{}~ 10.01.09 20:52:

а неймспейсы в php будут позволять содержать вызовы функций, методов?
Я тебе больше скажу:

Defining namespaces

Although any valid PHP code can be contained within a namespace, only three type of code are affected by namespaces: classes, functions and constants.
 

x-yuri

Новичок
я имею в виду файл типа:
Код:
<?php

namespace Namespace1;

func1(); // я так понимаю такое будет возможно в php (РАЗНИЦА)

class Class1 {
...
}

?>
а слеши там зачем? чтобы получить доступ к неймспейсу разве не :: будет использоваться?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху