Работа с классами

Crazy

Developer
Автор оригинала: T. Anre
Все-таки, все три кита на которых базируется ООП, соблюдаются, так что не надо говорить, что статики не есть ООП. :D
О каких именно трех китах идет речь в данном конкретном случае?
 

T. Anre

Новичок
Автор оригинала: dark-demon
и то, следует хорошо подумать прежде чем сковывать свои движения реестром!
Сейчас, разрабатываю интранет-двигло на чистом ООП, есть всего две функции "__autoload" и "errorHandler", остальное реализовано на статик-классах и объектах. Без статичного реестра объектов, пришлось бы использовать синглтон. А если вообще не использовать реестр, то приложение пришлось бы переписать в ПОП-стиле, либо юзать глобальный массив.
 

dark-demon

d(^-^)b
cDLEON, извини, не угнался за твоим полётом фантазии :) зачем писать "альтернативу глобалам"? чем сами глобалы не угодили?
я могу ответить на второй вопрос - основной недостаток глобалов в том, что поведение функции зависит не только от вызывающего её кода, но и от внешней по отношению к ним обоим сущности.
пример из жизни: функция использует глобальный объект для работы с БД (ну не предполагал разработчик, что БД может быть 2 штуки). требуется выполнить эту же функцию, но в контексте другой бд. если у нас глобал, то костылём будет сохранение старого объекта, подмена его новым, выполнение функции и последующее восстановление исходного объекта. с твоей же "альтернативой" можно сразу пить йад.
 

T. Anre

Новичок
Автор оригинала: Crazy
О каких именно трех китах идет речь в данном конкретном случае?
Этот случай?
PHP:
QWERTY::anyfunction();
Если да, то данном примере явно используется, только один кит, и то его уже назвали.
 

cDLEON

Онанист РНРСlub
dark-demon
Не зачем пить яд. Можно в самом объёкте работы с БД предусмотреть использование нескольких коннектов.
 

Crazy

Developer
Автор оригинала: T. Anre
Этот случай?
PHP:
QWERTY::anyfunction();
Если да, то данном примере явно используется, только один кит, и то его уже назвали.
Я говорю о class Registry. Ты в своей фразе о всех трех китах имел в виду другой код?
 

Crazy

Developer
T. Anre, честно говоря, мне непонятно твое стремление любой ценой избежать ответа на прямой вопрос. Ты хочешь скрыть партизанскую тайну? :)

Eще раз: конкретно к классу Registry применимы все эти три кита? Если да, то о каких именно китах (достаточно перечисления) идет речь?
 

cDLEON

Онанист РНРСlub
dark-demon
Сори ) Читал между строк ) Устал сегодня уже...
Если и делать такой объект, то нужно предусматривать возможное развитие событий.
А так - ты прав. Не спорю =))
 

T. Anre

Новичок
Автор оригинала: Crazy
T. Anre, честно говоря, мне непонятно твое стремление любой ценой избежать ответа на прямой вопрос. Ты хочешь скрыть партизанскую тайну? :)
*Я плакаль* :D

Автор оригинала: Crazy
Eще раз: конкретно к классу Registry применимы все эти три кита? Если да, то о каких именно китах (достаточно перечисления) идет речь?
Киты ООП:
- Инкапсуляция
- Наследование
- Полиморфизм

Класс Registry финализирован, следовательно, от него нельзя наследовать...
 

Crazy

Developer
Автор оригинала: T. Anre
Класс Registry финализирован, следовательно, от него нельзя наследовать...
...стало быть, один кит всплыл вверх брюхом. Осталось только два.

Впрочем, два ли? Как там у этого класса с полиморфизмом? Примерчик полиморфного использования можно увидеть?
 

T. Anre

Новичок
Автор оригинала: Crazy
...стало быть, один кит всплыл вверх брюхом. Осталось только два.
Из-за того, что всплыл один - наследование, за ним всплыл и другой - полиморфизм.

Автор оригинала: Crazy
Впрочем, два ли?
Один.

Автор оригинала: Crazy
Как там у этого класса с полиморфизмом?
Это типа экзамен? Или с какой целью задается вопрос.
 

Crazy

Developer
Автор оригинала: T. Anre
Это типа экзамен? Или с какой целью задается вопрос.
Ты сделал утверждение, показавшееся мне ложным. Соответственно, мне было интересно узнать: это утверждение действительно ложно или у меня уже старческий маразм.

По результатам общения я за себя спокоен.

Если же вернуться к истокам, то мы получаем следующее: статические классы нарушают по крайней мере одно из оснований ООП. Так что это если не "не совсем ООП", то уж по крайней мере "неканоническое использование ООП". :)
 

T. Anre

Новичок
Автор оригинала: Crazy
Примерчик полиморфного использования можно увидеть?
PHP:
<?php

abstract class Pet
{
	public function __construct()
	{
		$this->voice();
	}

	abstract function voice();
}

class Dog extends Pet
{
	function voice()
	{
		echo 'гав-гав';
	}
}

class Cat extends Pet
{
	function voice()
	{
		echo 'мяу-мяу';
	}
}

new Cat();
new Dog();
?>
-~{}~ 04.06.07 04:26:

Автор оригинала: Crazy
Если же вернуться к истокам, то мы получаем следующее: статические классы нарушают по крайней мере одно из оснований ООП.
Согласен, только вот пример, какие же из китов в нем нарушается(при том что инкапсуляция в данном случае - отдельный разговор)?
PHP:
<?php

class Pet
{
	public static function voice()
	{
		echo 'тишина';
	}
}

class Dog extends Pet
{
	public static function voice()
	{
		echo 'гав-гав';
	}
}

class Cat extends Pet
{
	public static function voice()
	{
		echo 'мяу-мяу';
	}
}

Cat::voice();
Dog::voice();
?>
-~{}~ 04.06.07 04:30:

Автор оригинала: Crazy
Ты сделал утверждение, показавшееся мне ложным.
Всегда готов учиться, так в чем же я ошибся(хотя вернее будет - неправильно выразился)?:)

-~{}~ 04.06.07 04:35:

Автор оригинала: T. Anre
Из-за того, что всплыл один - наследование, за ним всплыл и другой - полиморфизм.
з.ы. Полиморфизм всплыл в надежде на то, что в счет не берется перегрузка.
 

Crazy

Developer
T. Anre, браво! Изящный пример фигурного квотинга. С фидошных времен я это видел не более дюжины раз.

Вот только вопрос я задал совсем другой: "Как там у этого класса с полиморфизмом? Примерчик полиморфного использования можно увидеть? "

Выделенную часть ты отрезал. Ответ на получившийся в результате вопрос меня, прости, не интересует. Я и так знаю, что такое полиморфизм вообще. (И не только в PHP. В OCaml, к примеру, взгляды на полиморфизм заметно отличаются.)

Что касается следующего твоего примера с "Cat::voice(); Dog::voice();" то я лично не понял, что именно ты им хотел проиллюстрировать.

Соответственно, я повторю свой тезис: использование статических классов не соотносится со следующими принципами ООП:

1. Наследование
2. Полиморфизм

В том числе -- потому, что при этом мы теряем возможность уточнения поведения класса путем переопределения методов.
 

T. Anre

Новичок
О статиках в целом, с практической точки зрения:
Про то, что инкапсуляция есть у статиков, думаю это понятно. Некоторые признаки наследование, тоже присутствует.
Теперь о полиморфизме. Полиморфное поведение достигается путем переопределения, либо перегрузкой методов. Раз полиморфное поведение, можно реализовать на базе перегрузок и переопределения методов, соотвественно, статичные классы могут реализовать полиморфизм.

Наследование в статик-классах PHP возможно, только не рекомендую его использовать. Согласитесь не очень удобно приседать с self и parent там, где можно создать обычные объекты.

Автор оригинала: Crazy
Как там у этого класса с полиморфизмом?
Класс Registry используется как namespace для функций, этот класс реализует инкапсуляцию, но не имеет полиморфного поведения, а так же не демонстрирует наследования. Достаточно?:D
 

Crazy

Developer
Автор оригинала: T. Anre
Некоторые признаки наследование, тоже присутствует.
Осетрина не бывает второй свежести.

Полиморфное поведение достигается путем переопределения, либо перегрузкой методов.
Полиморфное поведение достигается только override'ом методов и не достигается overload'ом. Не надо путать теплое с мягким.

соотвественно, статичные классы могут реализовать полиморфизм.
Прекрасно. Можно увидеть пример? Для экономии времени сразу отмечу, что пример с "Cat::voice(); Dog::voice();" никакого полиморфизма не демонстрирует (надеюсь, это и не имелось в виду).

Юмор ситуации здесь в том, что понятие "полиморфизм" в ООП определено применительно к объектам. Нет объекта -- нет полиморфизма.
 
Сверху