Pull to refresh
4
Alexander Irbis@BlessMaster

Разработчик

8
Subscribers
Send message
Я думаю, что можно было бы отладочную версию в первопредке части объектов так и сделать и на продакшене просто убирать или заменять на логи с дампом стека и окружения.

По первам, как пример тёмной стороны магии, — поймал грабли такого молчаливого принятия несуществующих методов и свойств, которые поменяли местами логику кода.
Да, меня такие мысли тоже часто посещают — к ним ещё добавился опыт программирования на питоне :-)
Хочется в действительности совместить лучшие качества всех языков. Но мучает мысль, что лучшие они только до первой попытки создания этой гремучей смеси ))
Всё-таки наверно это было сделано ради простоты конвертации старых проектов, там где много mysql_ вызовов прямо в коде (да, такого ужаса хватает), без всяких абстракций вроде DB.
Но тут ситуация действительно такая: я тоже себе долго планировал перейти на mysqli — вроде и кода менять не много было, всё было вынесено в отдельный класс, но всё руки не доходили, не жало оно мне. А потом оказалось не актуально — перешёл на pg.
Да, про это я тоже писал, но про лямбды — таки мои данные оказались устаревшими, анонимные функции теперь замыкаются на экземпляр класса, в котором созданы.
Вот же ж блин, таки да — оно. Признаю, был не прав.

class B {

        protected $a = 'test';
        public function b() {
                $a = function () {
                        return $this->a;
                };
                return $a();
        }
}

$b = new B;

print $b->b()."\n";
// test


А я его по наивности через use пропихивать пытался, так и пришёл к выводу, что не работает, очень расстроился :-)
Впрочем я в любом случае ошибся с написанием — Вы правы.
Всё зависит от того, на каком языке ;-)
А в Советской России — программисты подсказывают IDE :-)

Вопрос, как выше уже обсудили не в том, чтобы знать порядок, а в том, чтобы порядок не мешал более хитрым динамическим конструкциям. Впрочем, мне переименование понадобилось ради лаконичных имён, позволяющих писать сложные выражения в строчку.
Вот же «век живи — век учись». Да, от Ресига такого не ожидал. Что лишний раз доказывает, что не стоит обожествлять авторитеты…
Для совместимости с разработчиками :-)
1. Ну уже поделитесь — таки любопытно. Обещаю не использовать как доказательство ни pro, ни contrau )))

2. Хорошо, с простой функцией — признаю, $callback(...) вполне работает подобно указателю, что с именем, переданным строкой, что с экземпляром Closure. Изящество пропадает при включении в эту модель методов объектов, но они по задумке ФП вроде как и не планировались…
Причём значительно быстрее, чем при использовании __get и __set.
Тут ещё одна особенность — в php (не знаю с каких пор) нет «несуществующих свойств» в приведённом смысле. Свойства создаются автоматически. То есть

$a = new StdClass;
$a->b = 123;
print $a->b;


отработает без запинки.
__set, __get, __call — это не совсем костыли, это магия :-)
То есть с их помощью можно реализовать куда больше, чем тривиальные геттеры и сеттеры. У меня например с их помощью реализуются миксины в рантайме, чего язык, даже в версии 5.5 до сих пор не предусматривает (trait'ы нельзя скомпоновать динамически).
Хотя последнее время магию сильно критикуют и есть за что, но в умелых руках и гомеопатических дозах — она бесценна.
Почему вдруг исключение?

$b = 'b'
$a->$b() — работает,
$a->b — выкинет исключение? Это непоследовательно

Помимо этого, в php следующий код будет работоспособен

class A {

        public $a = 'property';
        public function a() {return 'method';}
}

$a = new A;

print $a->a."\n";
print $a->a()."\n";


И именно это мешает разрулить: ссылка на метод или на функцию.
В языке есть возможность вызывать функции и классы по именам, но нет возможности передать ссылку на функцию или на класс. Даже лямбды — это по сути костыль в виде объекта с магическим методом.
А вот ещё секретный уровень:

mixed mysqli_query ( mysqli $link, string $query [, int $resultmode] )
Что самое интересное, до сих пор и нет другого способа его передать. Лямбды не признают $this
это точно так? Поскольку $().map(callback(indexInArray, valueOfElement))
Даже не знаю, каков критерий «много/мало»? По логике «больше нуля» — это уже много. Вопрос в другом — это было неизбежным, это не потребовало много времени, это не приводит к смертельному оверхеду, это до сих пор не вызвало конфликтов. Что ещё требуется от данного решения?

Да, хотелось бы, чтобы оно не понадобилось в принципе. Но оно понадобилось и с этим будем жить дальше.

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity