|
|
|
|
|
для: cheops
(22.11.2005 в 13:49)
| | может приводить при неправильном использовании.. | |
|
|
|
|
|
|
|
для: human
(22.11.2005 в 09:07)
| | Да нет я ничего против этого не имею, и тем более против вас - в книге действительно так всё и написано и не верить ей сложно, авторы наверняка знали о чём пишут. При организации счётчика памяти (особенно через ООП) - вполне можно ожидать падение производительности при использовании &. Меня возмущает, что разработчики не позаботились о том, чтобы & работал не медленнее передачи "по значению" - автоматическую передачу можно только приветствовать - сам я почти никогда не использую &, так как знаю об этой особенности, но меня неприятно удивило, то что использование & может приводить к более низкой производительности. | |
|
|
|
|
|
|
|
для: human
(21.11.2005 в 19:35)
| | Еще пару слов про ссылки. Хотите верьте - хотите нет, но...
В связи с распространившимся заболеванием под названием синдром WTMA
(Way Too Many Ampersand - "слишком много амперсандов" ) разработчиками PHP5
для облегчения жизни ООП-программистам были сделаны существенные изменения
в Zend 2 в отношении объектов. В результате - теперь можно почти совсем
забыть про этот значок & (амперсанд). Теперь за вас все сделает Zend.
Проверить это просто (если установлен PHP5): взять любой работающий скрипт,
в котором используются объекты, и тупо удалить все значки &.
Существует достаточно высокая вероятность, что этот скрипт будет продолжать
работать правильно.
Ох, боюсь только, что сейчас Уважаемый Cheops назовет это большой глупостью...:-) | |
|
|
|
|
|
|
|
для: Shorr Kan
(15.11.2005 в 22:08)
| | Вот по этой ссылке я выложил ZIP-архив, в котором содержатся две отсканированных странички по обсуждаемой проблеме.
http://valiv.pochta.ru/downl.htm
Для тех, кто интересуется работой PHP изнутри, можно порекомендовать почитать в PHP-мануале раздел
VI. Zend API, посвященный ядру PHP.
Ниже я привожу начало этого раздела, взятое из chm-файла перевода этого руководства.
--------------------------------------------------------------------------------------
Глава 25. Обзор
Что такое Zend и что такое PHP?
"Расширить PHP" легче сказать, чем сделать. PHP вырос в полноценную утилиту, состоящую из нескольких мегабайт исходного кода. При структурировании этой главы мы остановились на реализации подхода "обучения через выполнение". Это не самый научный и профессиональный подход, но этот метод более привлекателен и даёт наилучший конечный результат.
В последующих разделах вы быстро научитесь, как сделать так, чтобы самые основные расширения работали почти постоянно.
Затем вы узнаете о продвинутой API-функциональности Zend. Альтернативно можно было бы попытаться объединить функциональность, дизайн, подсказки, трюки, и т.п. в единое целое, давая таким образом полный обзор общей картины, прежде чем делать что-либо практически. Хотя это "лучший" метод, поскольку никаких неточностей не будет, он требует больших затрат времени и энергии, почему мы и решили использовать прямой подход.
Заметьте, что, хотя в этой главе сделана попытка дать как можно больше информации о внутренней работе PHP, невозможно дать абсолютно полный справочник расширения PHP, который обеспечивал бы 100% работоспособность во всех случаях. Можно разобраться в PHP, при таком сложном и объёмном пакете, только в том случае, если вы ознакомитесь с ним практически, поэтому мы советуем вам работать с исходным материалом.
Что такое Zend и что такое PHP?
Имя Zend это имя машины языка, ядра PHP. Термин PHP это вся система целиком. Это не так уж сложно понять (см. Рисунок 9.1). Чтобы реализовать интерпретатор Web-скриптов, необходимы три части:
Интерпретатор анализирует входной код, транслирует и выполняет его.
Функциональный модуль реализует функциональность языка (его функции и т.д.).
Интерфейс взаимодействует с Web-сервером и т.д.
Zend полностью выполняет работу части 1 и частично - части 2; PHP выполняет работу частей 2 и 3. Вместе они образуют законченный пакет PHP. Zend формирует только ядро языка, реализуя PHP в самой основе с помощью некоторых предопределённых функций. PHP содержит все модули, которые реально создают свойства языка.
----------------------------------------------------------------------------------------------------------- | |
|
|
|
|
|
|
|
для: isset
(20.11.2005 в 16:06)
| | Оказывается, вопросы я задавать умею... | |
|
|
|
|
|
|
|
для: human
(20.11.2005 в 19:10)
| | Следить глупо, т.к. если понадобилось $mas2 = $mas1 то значит кто-то из них будет меняться и поэтому нужно создать именно копию, а не ссылку | |
|
|
|
|
|
|
|
для: isset
(20.11.2005 в 14:52)
| | >
>при работе с массивами PHP автоматически создает ссылки в
>операциях присваивания или при передаче аргументов и в таких
>случаях копирования массивов не происходит (при условии, что
>в исходный массив не было записи).
>
|
>Докажите это примером кода.
Показать это на примере невозможно, т.к. описанный механизм действует не на уровне
кодов в тексте PHP-программы, а на уровне Zend-машины (процессора PHP).
Поэтому приходится верить на слово разработчикам PHP-процессора.
>PHP не может создавать сам ссылки, иначе если бы мы обнулили
>$mas2, то обнулился бы и $mas1
В том то и весь фокус, что не обнулится !
Я уже пытался дважды про это рассказать, но как-то бестолково.
PHP следит за состоянием всех внутренних ссылок и если обнаруживает, что происходит
запись в ссылаемую переменную (а ее обнуление - частный случай записи), то сразу же принимает меры, а именно: создает копию этой переменной.
Почему-то складывается впечатление, что все это мои измышления...:-), поэтому я дальше на эту тему продолжать не буду. Хотите верьте, хотите - нет...:-)
Мне все описанные механизмы показались вполне оптимальными и разумными.
Для тех, кто захочет в этой проблеме разобраться самостоятельно (и не имеет доступа к литературе) завтра отсканирую пару страниц и где-нибудь выложу. | |
|
|
|
|
|
|
|
для: Artem S.
(20.11.2005 в 15:39)
| | Имхо со вторым кодом неточное время. | |
|
|
|
|
|
|
|
для: Artem S.
(20.11.2005 в 15:23)
| | Хм...
<?
function test_ref(&$arr) {
sizeof($arr);
}
function test_val($arr) {
sizeof($arr);
}
$ar = range(0,100000);
test_ref($ar);
test_val($ar);
?>
|
Profile:
test.php::main()-----1,8 sec
test_ref()--------------4,9 sec
test_val()--------------0,040 ms
<?
function test_ref(&$arr) {
sizeof($arr);
}
function test_val($arr) {
return sizeof($arr);
}
$ar1 = range(0,80000);
$ar2 = range(0,80000);
test_ref($ar1);
echo test_val($ar2);
?>
|
Profile:
test.php::main()-----1,4 sec
test_ref()--------------902,7 ms
test_val()--------------0,400 ms | |
|
|
|
|
|
|
|
для: isset
(20.11.2005 в 14:56)
| | Не имеет смысл.
1. В функции используется sizeof, в который массив передается по значению и смысла в & уже нет.
2. Скрипт выполняется достаточно быстро - погрешность большая. | |
|
|
|
|