Функции встроенные в php

Ссылки в PHP

Хотя в PHP нет такого понятия, как указатель, все же существует возможность создавать ссылки на другие переменные. Существует две разновидности ссылок: и (переменные переменные) (первые часто называют просто ссылками). Жесткие ссылки появились в PHP версии 4 (в третьей версии существовали лишь символические ссылки).


Ссылки в PHP — это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели языка Си и не являются псевдонимами таблицы символов. В PHP имя переменной и её содержимое — это разные вещи, поэтому одно содержимое может иметь разные имена. Ближайшая аналогия — имена файлов Unix и файлы — имена переменных являются элементами каталогов, а содержимое переменных это сами файлы. Ссылки в PHP — аналог жёстких ссылок (hardlinks) в файловых системах Unix.

Жесткие ссылки в PHP

Жесткая ссылка представляет собой просто переменную, которая является синонимом другой переменной. Многоуровневые ссылки (то есть, ссылка на ссылку на переменную, как это можно делать, например, в Perl) не поддерживаются. Так что не стоит воспринимать жесткие ссылки серьезнее, чем синонимы. Чтобы создать жесткую ссылку, нужно использовать оператор & (амперсанд). Например:

Ссылаться можно не только на переменные, но и на элементы массива (этим жесткие ссылки выгодно отличаются от символических). Например:

Впрочем, элемент массива, для которого планируется создать символическую ссылку, может и не существовать. Как в следующем случае:

В результате выполнения рассмотренного скрипта, хотя ссылке $b и не было ничего присвоено, в массиве $A создастся новый элемент с ключом c и значением — пустой строкой (мы можем это определить по результату работы echo). То есть, жесткая ссылка на самом деле не может ссылаться на несуществующий объект, а если делается такая попытка, то объект создается.

: Если убрать строку, в которой создается жесткая ссылка, то будет выведено сообщение о том, что элемент с ключом c не определен в массиве $A.

Жесткие ссылки удобно применять при передаче параметров пользовательской функции и возврате значения из нее.

Символические ссылки (переменные переменные)

— это всего лишь строковая переменная, хранящая имя другой переменной (переменная переменная). Чтобы добраться до значения переменной, на которую ссылается символическая ссылка, необходимо применить дополнительный знак $ перед именем ссылки. Рассмотрим пример:

Мы видим, что для того, чтобы использовать обычную строковую переменную как ссылку, нужно перед ней поставить еще один символ $.Это говорит интерпретатору, что надо взять не значение самой $p, а значение переменной, имя которой хранится в переменной $p.

Символические ссылки (переменные переменные) используюся достаточно редко.

Жесткие ссылки и пользовательские функции

Еще один интересный пример:

  • Переменные, например foo($a)

  • Оператор new, например foo(new foobar())

  • Ссылки, возвращаемые функцией, например:

Рассмотрим еще одну возможность пользовательских функций PHP — возврат ссылок.

В этом примере устанавливается свойство объекта, возвращённого функцией find_var, а не его копии, как было бы без использования ссылок.

Удаление ссылок (сброс ссылок)


При удалении ссылки, просто разрывается связь имени и содержимого переменной. Это не означает, что содержимое переменной будет разрушено. Например:

Этот код не сбросит $b, а только $a.

И все же, жесткая ссылка — не абсолютно точный синоним объекта, на который она ссылается. Дело в том, что оператор Unset(), выполненный для жесткой ссылки, не удаляет объект, на который она ссылается, а всего лишь разрывает связь между ссылкой и объектом.

Итак, жесткая ссылка и переменная (объект), на которую она ссылается, совершенно равноправны, но изменение одной влечет изменение другой. Оператор Unset() разрывает связь между объектом и ссылкой, но объект удаляется только тогда, когда на него никто уже не ссылается.

Опять же, можно провести аналогию с вызовом unlink (в Unix).

 <<< Назад () 
 Вперед >>> (Что такое PHP?) 
Есть еще вопросы или что-то непонятно — добро пожаловать на наш  форум портала PHP.SU 
 

10 ответов

363 Лучший ответ

Это полностью избыточно. является более или менее сокращенным для , а аналогично . То есть делает обратную вещь плюс дополнительную проверку правдоподобия значения.

Или, другими словами, совпадает с , но не выдает предупреждения, если переменная не существует. Главное в этой функции: выполнить логическое сравнение, не беспокоясь о заданной переменной.

В руководстве указано следующее:

Вы можете просто использовать здесь.

30 дек. 2010, в 05:45 Поделиться 27

проверяет, установлена ​​ли переменная, а не null:

может возвращать значение true, если для переменной заданы определенные значения:

Чтобы продемонстрировать это, попробуйте следующий код: $a_var не назначен, установлен в 0 и установлен в 1.

30 дек. 2010, в 04:33 Поделиться 13

Принятый ответ неверен.

isset() НЕ эквивалентен! empty().

Вы создадите несколько неприятных и трудно отлаживаемых ошибок, если пойдет по этому маршруту. например попробуйте запустить этот код:

18 июль 2016, в 12:51 Поделиться 8

30 дек. 2010, в 05:35 Поделиться 4

Пустая проверка — это ссылочная переменная/массив имеет значение, если вы проверите php doc (empty), вы увидите, что это считается emtpy

в то время как isset проверяет, есть ли переменная isset и не null, которая также может быть найдена в php doc (isset)

30 дек. 2010, в 04:35 Поделиться 1


если мы используем одну и ту же страницу для добавления/редактирования с помощью кнопки отправки, как показано ниже

то мы не должны использовать

bcoz устанавливается все время, будь то страница добавления или редактирования, вместо этого мы должны использовать проверку ниже условия

30 дек. 2010, в 06:38 Поделиться

Возвращает если имеет непустое и ненулевое значение.

Это хорошо, что нужно знать. Другими словами, все от , до до «» вернет при использовании функции .

Ниже приведено описание функции isset():

Возвращает если существует; противном случае.

Другими словами, только переменные, которые не существуют (или переменные со строго значениями), возвращают в функцию . Все переменные, имеющие любой тип значения, будь то , пустая текстовая строка и т.д., .

08 июнь 2018, в 09:15 Поделиться

как насчет этого

Демо: http://sandbox.onlinephpfunctions.com/code/7131f142742f0765c2619841bb9abfa598bcf066

17 нояб. 2017, в 06:34 Поделиться

Это не обязательно.

22 май 2015, в 14:25 Поделиться

«Пустой»: работает только с переменными. Пустой может означать разные вещи для разных переменных типов (проверьте руководство: http://php.net/manual/en/function.empty.php).

«isset»: проверяет, существует ли переменная и проверяет истинное значение NULL или false. Может быть отменено путем вызова «unset». Еще раз проверьте руководство.

Использование одного из них зависит от типа переменной, которую вы используете.

Я бы сказал, что безопаснее проверять оба, потому что вы проверяете прежде всего, существует ли переменная, и если она не является действительно NULL или пустой.

30 дек. 2010, в 04:28 Поделиться

Ещё вопросы

  • 1059Безопасный хэш и соль для паролей PHP
  • 378Конвертировать из даты и времени MySQL в другой формат с помощью PHP
  • 340Не можете использовать объект типа stdClass в качестве массива?
  • 308Почему бы опустить закрывающий тег?
  • 296Разница между array_map, array_walk и array_filter
  • 276Как преобразовать дату в метку времени в PHP?
  • 266Извлекать числа из строки
  • 248Получить первые n символов строки
  • 237Тактика использования PHP на сайтах с высокой нагрузкой
  • 230Отслеживание времени выполнения скрипта в PHP

Null Оператор ??

В отличие от некоторых языков, где вы можете использовать имя переменной в качестве выражения в выражении и смело предполагать, что если значение не определено или пустое, то значение будет , PHP же будет бросать ошибку о неопределенной переменной, индексе и т. д. Это делает очень многословным, обычный код, с использованием , чем другие языки, как например, в следующем примере.

Даже при использовании тернарного оператора необходима функция . С новым null оператором вы можете существенно облегчить код:

Такое использование еще более эффективно в случаях цепочной проверки, требующих одного или несколько других операторов .

Маленькое дополнение: Если вы работаете с JavaScript, вы можете делать такие вещи:

Это не будет работать в PHP, и эквивалентный код на PHP установит значение 0, поскольку новый оператор работает только с значениями.

Увеличение строки ++

С числами все довольно просто, но что будет если инкрементить строки?


Что выведет данный код?

$a = 'fact_2';
echo ++$a;        //> fact_3

$a = '2nd_fact';
echo ++$a;        //> 2nd_facu

$a = 'a_fact';
echo ++$a;        //> a_facu

$a = 'a_fact?';
echo ++$a;        //> a_fact?

$a = 'Привет';
echo ++$a;        //> Привет

При инкременте строки, PHP увеличивает последний символ на символ следующий по алфавиту. И если в конце 2, то следующий символ будет 3. После t следует u. Однако эта операция не имеет никакого смысла в случае, когда строка заканчивается на не буквенно-численный символ.

Этот момент хорошо описан в официальной документации по операциям инкремента/декремента, однако многие не читали этот материал, потому что не ожидали встретить там ничего особенного.

Шунтирующие операторы (короткая запись)

При сравнении типа AND &&, если первое условие вернет , то нет смысла проверять следующие условия, потому что всё условие выполнится только если сразу все вложенные условия вернут что-либо отличное от empty (не false)…

При сравнении типа OR ||, если хоть одно условие вернет true или что-то отличное от empty, то нет смысла проверять следующие вложенные условия, потому что все условие выполняется когда хоть одно под-условие возвращает не false.

// foo() никогда не буде вызвана
// так как эти операторы являются шунтирующими (short-circuit)

$a = false && foo();
$b = ( false and foo() );
$c = true || foo();
$d = ( true  or  foo() );

Точное сравнение

PHP язык без строгой типизации и потому иногда могут возникать неожиданные результаты при сравнении (проверке) разных значений…

if( 0 == 'строка' ) echo 'Неужели?';
// Условие сработает и мы увидим: 'Неужели?'

// другими словами - строка превращается в число при сравнении и становится 0:
var_dump( 0 == 'строка' );   //> bool(true)

// но
var_dump( '0' == 'строка' ); //> bool(false)

Происходит так очевидно, потому что ‘строка’ превращается в ноль: intval( ‘строка’ ) = 0, а 0 == 0 это true, разумеется…

Так например можно пропустить переменную запроса:

// $_GET может быть любой строкой и проверка всегда будет срабатывать...
if( $_GET == 0 ){
	echo $_GET;
}

// поэтому по возможности ставьте проверку строго по типу
if( $_GET === '0' ){
	echo $_GET;
}

Все следующие значения одинаковы, при сравнении через == (не строгий оператор сравнения):

0 == false == "" == "0" == null == array()

Ну и так:

1 == '1нечто' == true
true == array(111)

Proposal

The coalesce, or , operator is added, which returns the result of its first operand if it exists and is not NULL, or else its second operand. This means the is completely safe and will not raise an E_NOTICE. Some examples of its use:

// Fetches the request parameter user and results in 'nobody' if it doesn't exist
$username = $_GET'user' ?? 'nobody';
// equivalent to: $username = isset($_GET) ? $_GET : 'nobody';
 
// Calls a hypothetical model-getting function, and uses the provided default if it fails
$model = Model::get($id) ?? $default_model;
// equivalent to: if (($model = Model::get($id)) === NULL) { $model = $default_model; }
 
// Parse JSON image metadata, and if the width is missing, assume 100
$imageData = json_decode(file_get_contents('php://input'));
$width = $imageData'width' ?? 100;
// equivalent to: $width = isset($imageData) ? $imageData : 100;

It can even be chained:

$x = NULL;
$y = NULL;
$z = 3;
var_dump($x ?? $y ?? $z); // int(3)
 
$x = "yarr" => "meaningful_value";
var_dump($x"aharr" ?? $x"waharr" ?? $x"yarr"); // string(16) "meaningful_value"

This example demonstrates the precedence relative to the ternary operator and the boolean or operator, which is the same as C#:

var_dump(2 ?? 3 ? 4  5);      // (2 ?? 3) ? 4 : 5        => int(4)
var_dump( || 2 ?? 3 ? 4  5); // ((0 || 2) ?? 3) ? 4 : 5 => int(4)

This example demonstrates how it is a short-circuiting operator:

function foo() {
    echo "executed!", PHP_EOL;
}
var_dump(true ?? foo()); // outputs bool(true), "executed!" does not appear as it short-circuited

Все объекты в PHP передаются по ссылке

Это свойство объектов вам возможно известно, но даже в этом случае можно поймать баг, поэтому при работе с объектами будьте внимательны.

Для примера, давайте рассмотрим такой код, когда мы используем объект для удобства, который создается из массива:

$data = (object) array(
	'my_val' => 'bar',
);

$var = $data;
$var->my_val = 'new_bar';

$var2 = $data;
echo $var2->my_val; //> new_bar

Мы создали казалось бы общие данные, который потом планируем использовать в разных переменных, меняя данные объекта где нужно, а где не нужно оставляя исходный вариант. В этом случае изменение данных будет менять их и в исходном варианте…

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

$data = array(
	'my_val' => 'bar',
);

$var = $data;
$var = 'new_bar';

$var2 = $data;
echo $var2; //> bar

Поэтому чтобы первый вариант работал правильно, в переменную нужно передавать копию объекта, создаваемую с помощью :

$data = (object) array(
	'foo' => 'bar',
);

$var = clone $data;
$var->foo = 'new_bar';

$var2 = clone $data;
echo $var2->foo; //> bar

Изменение типа данных в ключах массива

При создании индекса массива PHP автоматически преобразовывает тип данных. Это надо учитывать, при работе с ассоциативными массивами. Так например, если в индекс передать число в виде строки (‘555’), то в индексе оно станет числом, или если в индекс передать true, то оно станет числом 1, а вот null превратиться в пустую строку. Пример кода см. ниже.

В массиве может быть либо типа integer, либо типа string. может быть любого типа.

Дополнительно с ключом будут сделаны следующие преобразования:

  • Строки, содержащие целое число (исключая случаи, когда число предваряется знаком ) будут преобразованы к типу integer. Например, ключ со значением «8» будет в действительности сохранен со значением 8. С другой стороны, значение «08» не будет преобразовано, так как оно не является корректным десятичным целым.
  • Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, то есть дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением .
  • Тип bool также преобразовываются к типу integer. Например, ключ со значением true будет сохранен со значением и ключ со значением false будет сохранен со значением 0.
  • Тип null будет преобразован к пустой строке. Например, ключ со значением null будет в действительности сохранен со значением «». Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).
  • Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.

Вот пример:

$arr = [
	'555'   => 'val-1',  // int(555)
	555 .'' => 'val-2',  // int(555)
	'bar'   => 'val-3',  // "bar"
	false   => 'val-4',  // int(0)
	true    => 'val-5',  // int(1)
	null    => 'val-6',  // string(0) ""
	0       => 'val-7',  // int(0)
	1       => 'val-8',  // int(1)
	8.7     => 'val-9',  // int(8)
	'08'    => 'val-10', // string(2) "08"
			   'val-11', // int(556) 
];

var_dump( $arr );

/*
array(8) {       
	  => string(5) "val-2"
	=> string(5) "val-3"
	    => string(5) "val-7"
	    => string(5) "val-8"
	   => string(5) "val-6"
	    => string(5) "val-9"
	 => string(6) "val-10"
	  => string(6) "val-11"
}
*/

С этим читают