Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Недокументированный PHP

Решил собрать все недокументированные конструкции и возможности языка PHP, которые я знаю, в одном месте.

Переменные с числовым именем

$var = '123';
$$var = 'test';

var_dump(get_defined_vars());

Команда list для строк (работает не во всех версиях PHP)

list($a, $b) = 'HI';

echo $a, $b;

Доступ к приватным свойствам через массив

class smth
{
     private $prop = 'test';
}

$obj = new smth();
$arr = (array) $obj;
echo $arr["\0smth\0prop"];

arr[] в аргументах функции

function add(&$var)
{
    $var = 'element';
}

$arr = array();
add($arr[]);

var_dump($arr);

Может вы что-то ещё знаете?

13 комментариев
besisland.livejournal.com 2009

Использовать недокументированные возможности не следует.

gaius-julius.livejournal.com 2009

ну, последний трюк с $arr[] он, как я понимаю, не совсем недокументированный.

из документации же известно по-отдельности и про то как работает передача параметра по ссылке и что делает операция []...

gaius-julius.livejournal.com 2009

там, кстати, ошибка. объявлена функция add(&$var), а вызывается test()

Евгений Степанищев (bolknote.ru) 2009

Комментарий для besisland.livejournal.com:

Никто не говорит об использовании, это, скорее, курьёзы.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для gaius-julius.livejournal.com:

Документация говорит нам, что $arr[] для чтения недоступна, тут же это не так.

Спасибо, ошибку поправил.

siberex.livejournal.com 2009

Комментарий для Евгения Степанищева:

Так мы её не читаем, мы в неё пишем :-)

Евгений Степанищев (bolknote.ru) 2009

Комментарий для siberex.livejournal.com:

Никто не мешает прочитать :)

sharkman (sharkman.myopenid.com) 2009

Всё это есть в документации, читайте внимательно.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для sharkman.myopenid.com:

Покажите.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для sharkman.myopenid.com:

Давайте, например, list ( http://ru2.php.net/list ) посмотрим:

list — Assign variables as if they were an array
Note: list() only works on numerical arrays and assumes the numerical indices start at 0.

besisland.livejournal.com 2009

Комментарий для Евгения Степанищева:

О функции list:
Assign variables _as if they were an array_

О типе string, раздел «String access and modification by character»:
_Think of a string as an array_ of characters for this purpose.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для besisland.livejournal.com:

Т. е. правильно ли я вас понял, что вы считаете, что эта запись как бы говорит нам, что строку можно считать массивом?

Тогда объясните мне почему sort не принимает строку и $str[] не работает? И зачем нужны две функции array_slice и substr?

Евгений Степанищев (bolknote.ru) 2009

Комментарий для besisland.livejournal.com:

Ну и расскажите заодно почему в новых версиях PHP такое поведение list не работает.