Часто ли вам приходится заниматься приведением типов в РНР?

grigori

( ͡° ͜ʖ ͡°)
Команда форума
use? хмм ... а импорты в java и хедеры в c не напрягают? :)

а почему никто не прочит смерть java? она тоже вечно догоняющая, еще и BC ломает - старый код на новой версии обычно не собирается, и с GC всегда проблемы
 

AmdY

Пью пиво
Команда форума
а почему никто не прочит смерть java? она тоже вечно догоняющая, еще и BC ломает - старый код на новой версии обычно не собирается, и с GC всегда проблемы
У нас java для мобил отправилась на покой, все уже на kotlin.

use? хмм ... а импорты в java и хедеры в c не напрягают? :)
В use меня удручает то, что надо стандартные функции вроде in_array прокидывать, что особо печально в связи с невозможностью делать import foo.*. Вот пример https://github.com/doctrine/orm/blob/6dc46e78ccf4fe75c80884e7abe41b811f2204b6/lib/Doctrine/ORM/Query/Expr/Base.php#L8

Потому что страшно пока. Непривычная инфраструктура, вот это все.
Дело в том, что это как раз уже привычно и понимаешь, насколько криво реализовано в сравнении с другими языками.
 

Вурдалак

Продвинутый новичок
Это связано с тем, что если писать просто in_array() в неймпейсе Foo, то PHP сначала попытается найти функцию Foo\in_array(), а лишь затем in_array().

Либо нужно забить, либо писать \in_array(), либо выносить в use.

В любом случае, это делает прозрачно PhpStorm, а блок use скрыт, поэтому это непонятная проблема.
 

fixxxer

К.О.
Партнер клуба
А можно phpstorm как-нибудь научить автоматом импортировать в неймспейс все функции, которых нет в текущем неймспейсе, без написания ручками бэкслеша типа \in_array()? У меня чот не получилось. Если ручками писать - то мне проще забить (как я и делаю).
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
мм ... а разве это не резолвится при компиляции? я просто запущу и проверю, влияет ли это на скорость в цикле
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
нихрена нет разницы, вообще \in_array писать или in_array

PHP:
<?php
namespace C;
class A
{
    public static function foo(){
        for($i=0;$i<2000000;++$i) \in_array(1,[1,2]);
    }
}

$start = microtime(true);
A::foo();
echo microtime(true) - $start;
 

Adelf

Administrator
Команда форума
Разница была. В одной из недавних версий это соптимизировали вроде.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
измерил с компиляцией в cli
Код:
for i in `seq 300`; do php test.php; done
PHP:
namespace C;
class A
{
    public static function foo(){
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
in_array(1,[1,2]);
    }
}

A::foo();
без разницы
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Это неправильный способ это бенчить, тут понятно, что между первым и последующим вызовами не может появиться объявление функции, вполне может и кэшироваться там внутри. Надо еще какой-то внешний (относительно zend vm) вызов внутри (который теоретически мог бы объявить функцию in_array в неймспейсе).

Хотя это, конечно, в любом случае микрооптимизация.

Мне скорее не нравится сам факт попытки вызова функции в неймспейсе, хочется писать явно.
 

fixxxer

К.О.
Партнер клуба
измерил с компиляцией в cli
Code:
А opcache на cli не включен ли? :) Хотя тут ты в любом случае в основном бенчишь время инициализации.

Да не в бенчмарках тут дело, просто ну как-то неаккуратненько, добавилась функция в неймспейс - happy debugging suckers. А ведь кому-то может прийти в голову и умышленно это использовать, для этакого манки-патчинга.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
с каких пор ты стал бояться теории заговора?
 

Вурдалак

Продвинутый новичок
Да, это такая психологическая вещь. Каждый раз при написании просто in_array() в голове крутится мысль, что вызов двусмысленный. А не хочется думать о таком, хочется однозначности.

Эта же хрень используется некоторыми для тестов, когда прямо во время тестов инициализируется функция Foo\in_array() с нужным поведением.

А вот где гарантии, что не будет пакета, среди тысяч зависимостей, где какой-нибудь умник не решит, например, сделать «правильную» версию функции, которая, например, вместо return false выбрасывает исключение? Поправка: такое скорее может настигнуть PHP-разработчиков, если наконец сделают автозагрузку для функций. Пока относительно безопасно, конечно.

Я лично скорее готов терпеть use function in_array().
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А можно phpstorm как-нибудь научить автоматом импортировать в неймспейс все функции, которых нет в текущем неймспейсе, без написания ручками бэкслеша типа \in_array()? У меня чот не получилось. Если ручками писать - то мне проще забить (как я и делаю).
У меня вроде интеншн из EA Ultimate в пхпшторме подсказывает подстановку корневого неймспейса для функций.


измерил с компиляцией в cli
без разницы
Проверять надо хотя бы как тут: https://github.com/Roave/FunctionFQNReplacer
 
Сверху