Только сейчас задумался об абсурдности кода, например: PHP: <?php function foo(Bar $bar = null){ $bar = $bar ? $bar : new Bar(); // ... }
Simpliest В том что первая строчка задает значение по-умолчанию. Вторая строчка тоже задает значение по умолчанию. Можно, конечно написать и третью, аналогичную строчку, но это уже будет домысел, а так пример из жизни. Встречается достаточно часто PS> И вообще, четыре слова "Bar" в одной строке, разделенные непонятными знаками, это вообще круто ) PHP: <?php $bar = $bar , $bar | $bar & $bar * $bar / $bar // ...
Вот в этом твоя ошибка. В приведенном тобой коде первая строчка задает тип параметра и его необязательность. А вторая дефолтную инициализацию нужным объектом если не был передан параметр. Дело в том, что такой финт ушами PHP: <?php function foo(Bar $bar = new Bar()){ // ... } сделать нельзя.
Simpliest я не пытаюсь сейчас выяснить как можно, как нельзя, почему можно или почему нельзя. Где происходит инициализация, чем руководствовались разработчики php. Т.к. это делается на другом сайте при помощи почтовых рассылок. ну да, взамен можно PHP: <?php function foo($bar = 'bar') ?> И означать это будет, в переводе на русский язык, что переменной $bar присваивается значение 'bar' если значение переменной не было передано явно. В общем, не думаю что стоит устраивать полемику и по этому поводу Simpliest, ты лучше объясни что обозначает одно и то же слово, встречающееся четыре раза в строчке и разделенное разными знаками препинания UPD> Ах да, совсем забыл: PHP: <?php $bar = $bar ?: new Bar(); ?> Ну да, одна и та же конструкция обозначает разные вещи.
[отвлеченно] Читал Маркуса, где он и группа программистов обсуждали на сорока страницах, стоит ли в интерфейсе объявлять публичные поля объекта [NeoPHP] <?neo function foo($name, $planet = ($planet implements SolarSistem) ? $planet : new ForeignBody::create()->inject($planet)){} [/NeoPHP]
Нельзя взамен. Мы ожидаем объект, установить объект в качестве значения по умолчанию - нельзя. Поэтому код из первого сообщения вполне корректен. Ты регулярки видел? Вот задай свой вопрос автору регулярок. Ты сколько выпил?
Уместней спросить "сколько работал" Объект - та же переменная, только с яйцами. У них структура в ZendEngine общая. Конечно, объекты как "тип данных" в терминах Си ушли далеко от простых переменных. Единственная причина, почему нельзя выполнить Код (Text): function(ZendObject $object = new Object()){} является тем, что параметры не могут содержать исполняемого кода, а new stdObject и есть исполняемый код.
Simpliest чтобы по ф5 посмотреть результат возвращаемый функцией, писать на новой строке оказалось лениво
PHP: <?php class Foo { static $self; static public function insatnce(){ // ... self::$self = new self(); // ... } } PHP: <? self::$self = new self(); ?>
врать не буду, я не понял зачем. Единственный вариант: для того, что б второй кусок кода вынести в отдельный файл и потом его инклюдить? =)
+1 Хорошая идея, жаль нельзя, а то бы я ща как развернулся )) Верхний код, это область применения, нижний - конкретная сумбурная строка Эх Код (Text): <?neophp $value = def new Value(); // ... class UserSingletoon realized Singletoon{ // ... } ?>
Продолжу с self-ами: PHP: <?php static public function instance(){ if (!self::$self){ self::$self = new self(); } return self::$self; }
На php.net есть несколько комментариев как добиться подобного в php5.3... Я периодически задумываюсь как такого добиться на php5.2...
пишите, Киса Спасибо, надо бы потихоньку перебираться, а то как ознакомился с пресс-релизом полтора года назад, так до сих пор и не трогал 5.3 никак, проще перейти на C++, либо писать кодогенераторы
Volt(220) не то. PHP: <?php class DatabaseConnection extends Singleton ?> Пока множественного наследования нет, это костыль. Хотя согласен, в 80% случаев этот вариант подходит С другой стороны Singleton крайне не удобен в тестах, поэтому его лучше заменить реестром. Но вопрос не в том, что лучше, что хуже. Вопрос в том, что нельзя указать несколько реализаций класса. Можно объявить несколько интерфейсов, но нельзя указать множество родительских классов. Практически любую схему множественного наследования можно перевести в схему делегирования, но опять таки, вопрос не в том что хуже или лучше. Гибкость языка, от части, определяется возможностью использовать разные схемы в зависимости от задачи. А мы имеем дело с ограничениями, которые потом думаем как обходить. Нет, не спорю, можно писать чушь в каждом классе: вот тебе чушь для реализации этой возможности, вот тебе чушь для реализации этой. Все счастливы, все довольны.
PHP: <?php class AbstractClientSession extends stdSingleton{} class UserSession extends AbstractClientSession{} class GuestSession extends AbstractClientSession{} class AdminSession extends AbstractClientSession{} UserSession::instance()->setRole( new RoleUser(), new RoleGuest() ); GuestSession::instance()->setRole( new RoleGuest() ); AdminSession::instance()->setRole( new RoleUser(), new RoleModerator(), new RoleAdmin()); // vs <?neophp class AbstractClientSession extends stdSingleton{} class UserSession extends AbstractClientSession realized RoleUser, RoleGuest{} class GuestSession extends AbstractClientSession realized RoleGuest{} class AdminSession extends AbstractClientSession realized RoleUser, RoleModerator, RoleAdmin{} ?> В реализации есть несущественные отличия, но в первом случае приходится писать рутинную "чушь". Второй можно оптимизировать по производительности (перекладываем часть логики на Си вместо виртуальной машины zend) Второй вариант проще воспринимать (имхо) Второй вариант быстрее написать (не нужно реализовывать механизм делегирование там где этого можно избежать)