Поиск…


Синтаксис

  • $ variable = 'value'; // Назначение общей переменной
  • $ object-> property = 'value'; // Назначение свойства объекта
  • ClassName :: $ property = 'value'; // Назначение свойства static class
  • $ array [0] = 'значение'; // Присвоить значение индексу массива
  • $ array [] = 'значение'; // Нажмите элемент в конце массива
  • $ array ['key'] = 'value'; // Назначение значения массива
  • echo $ variable; // Echo (print) значение переменной
  • some_function (переменные $); // Использовать переменную как параметр функции
  • снята с охраны ($ переменная); // Отменить переменную
  • $$ variable = 'value'; // Назначение переменной переменной
  • Исеть ($ переменная); // Проверяем, установлена ​​ли переменная или нет.
  • пустой ($ переменная); // Проверяем, является ли переменная пустой или нет.

замечания

Проверка типа

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

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

<?php

/**
 * Juggle numbers and return true if juggling was
 * a great success.
 */
function numberJuggling(int $a, int $b) : bool
{
    $sum = $a + $b;

    return $sum % 2 === 0;
}

Примечание. PHP gettype() для целых чисел и булевых чисел является integer и boolean соответственно. Но для типа-намека на такие переменные вам нужно использовать int и bool . В противном случае PHP не даст вам синтаксической ошибки, но он будет ожидать передачи integer и boolean классов .

В приведенном выше примере выдается ошибка в случае, если нечисловое значение задано как параметр $a или $b , и если функция возвращает что-то еще, кроме true или false . Вышеприведенный пример является «свободным», так как вы можете присвоить значение float $a или $b . Если вы хотите применять строгие типы, то есть вы можете вводить только целые числа, а не float, добавьте следующее в начало файла PHP:

<?php
declare('strict_types=1');

До того, как функции и методы PHP 7 разрешили тип намека на следующие типы:

  • callable (вызываемая функция или метод)
  • array (любой тип массива, который может содержать и другие массивы)
  • Интерфейсы (Fully-Qualified-Class-Name или FQDN)
  • Классы (FQDN)

См. Также: Вывод значения переменной

Доступ к динамической переменной по имени (переменные переменные)

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

Чтобы превратить переменную в переменную переменную, вы помещаете дополнительный $ put перед своей переменной.

$variableName = 'foo';
$foo = 'bar';

// The following are all equivalent, and all output "bar":
echo $foo;
echo ${$variableName};
echo $$variableName;

//similarly,
$variableName  = 'foo';
$$variableName = 'bar';

// The following statements will also output 'bar'
echo $foo; 
echo $$variableName; 
echo ${$variableName};

Переменные переменные полезны для отображения вызовов функции / метода:

function add($a, $b) {
    return $a + $b;
}

$funcName = 'add';

echo $funcName(1, 2); // outputs 3

Это особенно полезно в PHP-классах:

class myClass {
    public function __construct() {
        $functionName = 'doSomething';
        $this->$functionName('Hello World');
    }

    private function doSomething($string) {
        echo $string; // Outputs "Hello World"
    }
}

Возможно, но не обязательно ставить $variableName между {} :

${$variableName} = $value;

Следующие примеры эквивалентны и выводятся «baz»:

$fooBar = 'baz';
$varPrefix = 'foo';

echo $fooBar;               // Outputs "baz"
echo ${$varPrefix . 'Bar'}; // Also outputs "baz"

Использование {} является обязательным только тогда, когда имя переменной само является выражением, например:

${$variableNamePart1 . $variableNamePart2} = $value;

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

Хотя это не рекомендуется делать, можно связать это поведение:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

Важно отметить, что чрезмерное использование переменных переменных считается плохой практикой многих разработчиков. Поскольку они не подходят для статического анализа современными IDE, большие базы кода со многими переменными переменными (или вызовы динамических методов) могут быстро стать трудноподдерживаемыми.


Различия между PHP5 и PHP7

Другая причина всегда использовать {} или () , заключается в том, что PHP5 и PHP7 имеют несколько иной способ работы с динамическими переменными, что в некоторых случаях приводит к другому результату.

В PHP7 динамические переменные, свойства и методы теперь будут оцениваться строго в порядке слева направо, в отличие от сочетания особых случаев в PHP5. Приведенные ниже примеры показывают, как изменился порядок оценки.

Случай 1: $$foo['bar']['baz']

  • Интерпретация PHP5: ${$foo['bar']['baz']}
  • Интерпретация PHP7: ($$foo)['bar']['baz']

Случай 2: $foo->$bar['baz']

  • Интерпретация PHP5: $foo->{$bar['baz']}
  • Интерпретация PHP7: ($foo->$bar)['baz']

Случай 3: $foo->$bar['baz']()

  • Интерпретация PHP5: $foo->{$bar['baz']}()
  • Интерпретация PHP7: ($foo->$bar)['baz']()

Случай 4: Foo::$bar['baz']()

  • Интерпретация PHP5: Foo::{$bar['baz']}()
  • Интерпретация PHP7: (Foo::$bar)['baz']()

Типы данных

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

В PHP существуют следующие типы данных: null, boolean, integer, float, string, object, resource и array.

Ноль

Нуль может быть присвоен любой переменной. Он представляет переменную без значения.

$foo = null;

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

логический

Это самый простой тип с двумя возможными значениями.

$foo = true;
$bar = false;

Булевы могут использоваться для управления потоком кода.

$foo = true;

if ($foo) {
    echo "true";
} else {
    echo "false";
}

целое число

Целое число - целое число положительное или отрицательное. Он может использоваться с любой числовой базой. Размер целого числа зависит от платформы. PHP не поддерживает целые числа без знака.

$foo = -3;  // negative
$foo = 0;   // zero (can also be null or false (as boolean)
$foo = 123; // positive decimal
$bar = 0123; // octal = 83 decimal
$bar = 0xAB; // hexadecimal = 171 decimal
$bar = 0b1010; // binary = 10 decimal
var_dump(0123, 0xAB, 0b1010); // output: int(83) int(171) int(10)

терка

Числа с плавающей запятой, «двойники» или просто называемые «поплавки» - это десятичные числа.

$foo = 1.23;
$foo = 10.0;
$bar = -INF;
$bar = NAN;

массив

Массив подобен списку значений. Простейшая форма массива индексируется целым числом и упорядочивается индексом, причем первый элемент лежит в индексе 0.

$foo = array(1, 2, 3); // An array of integers
$bar = ["A", true, 123 => 5]; // Short array syntax, PHP 5.4+

echo $bar[0];    // Returns "A"
echo $bar[1];    // Returns true
echo $bar[123];  // Returns 5
echo $bar[1234]; // Returns null

Массивы также могут связывать ключ, отличный от целочисленного индекса, к значению. В PHP все массивы являются ассоциативными массивами за кулисами, но когда мы относимся к «ассоциативному массиву» отчетливо, мы обычно подразумеваем тот, который содержит один или несколько ключей, которые не являются целыми числами.

$array = array();
$array["foo"] = "bar";
$array["baz"] = "quux";
$array[42] = "hello";
echo $array["foo"]; // Outputs "bar"
echo $array["bar"]; // Outputs "quux"
echo $array[42]; // Outputs "hello"

строка

Строка похожа на массив символов.

$foo = "bar";

Как и массив, строка может быть проиндексирована для возврата отдельных символов:

$foo = "bar";
echo $foo[0]; // Prints 'b', the first character of the string in $foo.

объект

Объект является экземпляром класса. Его переменные и методы можно получить с помощью оператора -> .

$foo = new stdClass(); // create new object of class stdClass, which a predefined, empty class
$foo->bar = "baz";
echo $foo->bar; // Outputs "baz"
// Or we can cast an array to an object:
$quux = (object) ["foo" => "bar"];
echo $quux->foo; // This outputs "bar".

Ресурс

Переменные ресурсов содержат специальные дескрипторы открытых файлов, соединений с базами данных, потоков, областей холста изображения и т.п. (как указано в руководстве ).

$fp = fopen('file.ext', 'r'); // fopen() is the function to open a file on disk as a resource.
var_dump($fp); // output: resource(2) of type (stream)

Чтобы получить тип переменной в виде строки, используйте gettype() :

echo gettype(1); // outputs "integer"
echo gettype(true); // "boolean"

Глобальная передовая практика

Мы можем проиллюстрировать эту проблему следующим псевдокодом

function foo() {
    global $bob;
    $bob->doSomething();
}

Ваш первый вопрос здесь является очевидным

Откуда взялся $bob ?

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

Если бы это была настоящая программа, ваша следующая забава заключалась в том, чтобы отслеживать все экземпляры $bob и надеяться, что вы найдете правильный (это становится хуже, если $bob используется везде). Хуже того, если кто-то еще идет и определяет $bob (или вы забыли и повторно использовали эту переменную), ваш код может сломаться (в приведенном выше примере кода наличие неправильного объекта или вообще никакого объекта приведет к фатальной ошибке).

Поскольку практически все PHP-программы используют код типа include('file.php'); ваша работа, поддерживающая такой код, становится экспоненциально сложнее, чем больше файлов вы добавляете.

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

$dbConnector = new DBConnector(...);

function doSomething() {
    global $dbConnector;
    $dbConnector->execute("...");
}

Для модульной проверки этой функции вам необходимо переопределить глобальную переменную $dbConnector , запустить тесты, а затем сбросить ее до исходного значения, что очень опасно:

/**
 * @test
 */
function testSomething() {
     global $dbConnector;

     $bkp = $dbConnector; // Make backup
     $dbConnector = Mock::create('DBConnector'); // Override

     assertTrue(foo());

     $dbConnector = $bkp; // Restore
}

Как нам избежать глобалов?

Лучший способ избежать глобалов - это философия под названием « Инъекция зависимостей» . Здесь мы передаем инструменты, которые нам нужны, в функцию или класс.

function foo(\Bar $bob) {
    $bob->doSomething();
}

Это намного легче понять и поддерживать. Невозможно угадать, где был установлен $bob , потому что вызывающий отвечает за то, что он знает, что (мы передаем нам то, что нам нужно знать). Еще лучше, мы можем использовать объявления типа, чтобы ограничить передаваемое.

Таким образом, мы знаем, что $bob является либо экземпляром класса Bar , либо экземпляром дочернего элемента Bar , что означает, что мы знаем, что можем использовать методы этого класса. В сочетании со стандартным автозагрузчиком (доступным начиная с PHP 5.3) мы можем теперь отслеживать, где определен Bar . PHP 7.0 или более поздняя версия включает расширенные объявления типов, где вы также можете использовать скалярные типы (например, int или string ).

4,1

Суперглобальные переменные

Супер-глобальные переменные в PHP - это предопределенные переменные, которые всегда доступны, могут быть доступны из любой области сценария.

Нет необходимости делать глобальную переменную $; для доступа к ним в рамках функций / методов, классов или файлов.

Эти суперглобальные переменные PHP перечислены ниже:

Получение всех определенных переменных

get_defined_vars() возвращает массив со всеми именами и значениями переменных, определенных в области, в которой вызвана функция. Если вы хотите печатать данные, вы можете использовать стандартные функции для вывода данных, считываемых человеком, например print_r или var_dump .

var_dump(get_defined_vars());

Примечание . Эта функция обычно возвращает только 4 суперглобала : $_GET , $_POST , $_COOKIE , $_FILES . Другие суперглобалы возвращаются только в том случае, если они были использованы где-то в коде. Это связано с директивой auto_globals_jit которая включена по умолчанию. Когда он включен, переменные $_SERVER и $_ENV создаются при первом использовании (Just In Time), а не при запуске скрипта. Если эти переменные не используются в сценарии, включение этой директивы приведет к увеличению производительности.

Значения по умолчанию неинициализированных переменных

Хотя PHP не требуется, однако для инициализации переменных очень хорошая практика. Неинициализированные переменные имеют значение по умолчанию для своего типа в зависимости от контекста, в котором они используются:

Unset AND unreferenced

var_dump($unset_var); // outputs NULL

логический

echo($unset_bool ? "true\n" : "false\n"); // outputs 'false' 

строка

$unset_str .= 'abc';
var_dump($unset_str); // outputs 'string(3) "abc"'

целое число

$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int); // outputs 'int(25)'

Float / двойной

$unset_float += 1.25;
var_dump($unset_float); // outputs 'float(1.25)'

массив

$unset_arr[3] = "def";
var_dump($unset_arr); //  outputs array(1) {  [3]=>  string(3) "def" }

объект

$unset_obj->foo = 'bar';
var_dump($unset_obj); // Outputs: object(stdClass)#1 (1) {  ["foo"]=>  string(3) "bar" }

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

Истинный оператор с переменной стоимостью

В PHP значения переменных имеют связанную «правду», поэтому даже небулевые значения будут равными true или false . Это позволяет использовать любую переменную в условном блоке, например

if ($var == true) { /* explicit version */ }
if ($var) { /* $var == true is implicit */ }

Вот некоторые основные правила для разных типов значений переменных:

  • Строки с ненулевой длиной равны true включая строки, содержащие только пробелы, такие как ' ' .
  • Пустые строки '' равны false .
$var = '';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

$var = '   ';
$var_is_true = ($var == true); // true
$var_is_false = ($var == false); // false
  • Целые числа равны true если они отличны от нуля, а нуль - false .
$var = -1;
$var_is_true = ($var == true); // true
$var = 99;
$var_is_true = ($var == true); // true
$var = 0;
$var_is_true = ($var == true); // false
  • null равно false
$var = null;
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
  • Пустые строки '' и нулевой нуль '0' равны false .
$var = '';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

$var = '0';
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true
  • Значения с плавающей запятой равны true если они отличны от нуля, а нулевые значения равны false .
    • NAN (не-номер PHP) соответствует true , т. NAN == true является true . Это связано с тем, что NAN является ненулевым значением с плавающей запятой.
    • Zero-значения включают в себя как +0, так и -0, как определено IEEE 754. PHP не различает +0 и -0 в своей плавающей запятой с двойной точностью, то есть floatval('0') == floatval('-0') true .
      • Фактически, floatval('0') === floatval('-0') .
      • Кроме того, оба floatval('0') == false и floatval('-0') == false .
$var = NAN;
$var_is_true = ($var == true); // true
$var_is_false = ($var == false); // false

$var = floatval('-0');
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

$var = floatval('0') == floatval('-0');
$var_is_true = ($var == true); // false
$var_is_false = ($var == false); // true

ИДЕНТИФИКАЦИОННЫЙ ОПЕРАТОР

В документации PHP для операторов сравнения имеется Идентичный оператор === . Этот оператор может использоваться для проверки того, совпадает ли переменная с эталонным значением:

$var = null;
$var_is_null = $var === null; // true
$var_is_true = $var === true; // false
$var_is_false = $var === false; // false

Он имеет соответствующий не идентичный оператор !== :

$var = null;
$var_is_null = $var !== null; // false
$var_is_true = $var !== true; // true
$var_is_false = $var !== false; // true

Идентичный оператор может использоваться как альтернатива языковым функциям типа is_null() .

ИСПОЛЬЗОВАНИЕ CASE С strpos()

Функция языковых функций strpos($haystack, $needle) используется для определения индекса, в котором $needle встречается в $haystack , или же это происходит вообще. Функция strpos() чувствительна к регистру; если нечувствительный к регистру поиск - это то, что вам нужно, вы можете пойти с stripos($haystack, $needle)

Функция strpos & stripos также содержит третье offset параметра (int), которое, если указано, будет запускать это количество символов, отсчитываемых от начала строки. В отличие от strrpos и strripos, смещение не может быть отрицательным

Функция может вернуться:

  • 0 если $needle найден в начале $haystack ;
  • ненулевое целое число, определяющее индекс, если $needle найден где-то иначе, чем начало в $haystack ;
  • и значение false если $needle не найден нигде в $haystack .

Поскольку как 0 и false имеют правду false в PHP, но представляют собой отдельные ситуации для strpos() , важно различать их и использовать идентичный оператор === чтобы точно выглядеть как false а не только значение, равное false .

$idx = substr($haystack, $needle);
if ($idx === false) 
{
    // logic for when $needle not found in $haystack
} 
else
{
    // logic for when $needle found in $haystack
}

Альтернативно, используя не идентичный оператор:

$idx = substr($haystack, $needle);
if ($idx !== false) 
{
    // logic for when $needle found in $haystack
} 
else
{
    // logic for when $needle not found in $haystack
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow