php название переменной в переменной

Php название переменной в переменной

It may be worth specifically noting, if variable names follow some kind of «template,» they can be referenced like this:

I found another undocumented/cool feature: variable member variables in classes. It’s pretty easy:

?>

This however would be reinventing the wheel when you can simply use:

Variable Class Instantiation with Namespace Gotcha:

Say you have a class you’d like to instantiate via a variable (with a string value of the Class name)

?>

The above works fine UNLESS you are in a (defined) namespace. Then you must provide the full namespaced identifier of the class as shown below. This is the case EVEN THOUGH the instancing happens in the same namespace. Instancing a class normally (not through a variable) does not require the namespace. This seems to establish the pattern that if you are using an namespace and you have a class name in a string, you must provide the namespace with the class for the PHP engine to correctly resolve (other cases: class_exists(), interface_exists(), etc.)

Sometimes you might wish to modify value of an existing variable by its name. This is easily accomplishable with a combination of using «passing by reference» and «variable variables».

$first_var = 1;
$second_var = 2;
$third_var = 3;

$which_one = array_rand(‘first’, ‘second’, ‘third’);
//Let’s consider the result is «second».

These are the scenarios that you may run into trying to reference superglobals dynamically. Whether or not it works appears to be dependent upon the current scope.

// Works as expected
var_dump ($< '_POST' >);

Note that normal variable variables will not be parsed in double-quoted strings. You’ll have to use the braces to make it work, to resolve the ambiguity. For example:

Adding an element directly to an array using variables:

Fatal error: Cannot use [] for reading

This is not a bug, you need to use the <> syntax to remove the ambiguity.

One interesting thing I found out: You can concatenate variables and use spaces. Concatenating constants and function calls are also possible.

If you want to use a variable value in part of the name of a variable variable (not the whole name itself), you can do like the following:

= 10 ;
$price_for_tuesday = 20 ;
$price_for_wednesday = 30 ;

PHP actually supports invoking a new instance of a class using a variable class name since at least version 5.2

class Foo <
public static function hello () <
echo ‘Hello world!’ ;
>
>
$my_foo = ‘Foo’ ;
$my_foo :: hello (); //prints ‘Hello world!’
?>

While not relevant in everyday PHP programming, it seems to be possible to insert whitespace and comments between the dollar signs of a variable variable. All three comment styles work. This information becomes relevant when writing a parser, tokenizer or something else that operates on PHP syntax.

/*
I am complete legal and will compile without notices or error as a variable variable.
*/
$foo = ‘magic’ ;

?>

Behaviour tested with PHP Version 5.6.19

Another use for this feature in PHP is dynamic parsing..

Due to the rather odd structure of an input string I am currently parsing, I must have a reference for each particular object instantiation in the order which they were created. In addition, because of the syntax of the input string, elements of the previous object creation are required for the current one.

// this is only a skeletal example, of course.
$object_array = array();

?>

Now, we can use basic array manipulation to get these objects out in the particular order we need, and the objects no longer are dependant on the previous ones.

I haven’t fully tested the implimentation of the objects. The scope of a variable-variable’s object attributes (get all that?) is a little tough to crack. Regardless, this is another example of the manner in which the var-vars can be used with precision where tedious, extra hard-coding is the only alternative.

Then, we can easily pull everything back out again using a basic array function: foreach.

?>

Through this, we can pull a dynamically named object out of the array it was stored in without actually knowing its name.

Источник

Php название переменной в переменной

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

Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчёркивания и состоять из букв, цифр и символов подчёркивания в любом количестве. Это можно отобразить регулярным выражением: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

Замечание: Под буквами здесь подразумеваются символы a-z, A-Z и байты от 128 до 255 ( 0x80-0xff ).

Для информации о функциях работы с переменными обращайтесь к разделу функций работы с переменными.

$ 4site = ‘ещё нет’ ; // неверно; начинается с цифры
$_4site = ‘ещё нет’ ; // верно; начинается с символа подчёркивания
$täyte = ‘mansikka’ ; // верно; ‘ä’ это (Расширенный) ASCII 228.
?>

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

PHP также предлагает иной способ присвоения значений переменным: присвоение по ссылке. Это означает, что новая переменная просто ссылается (иначе говоря, «становится псевдонимом» или «указывает») на оригинальную переменную. Изменения в новой переменной отражаются на оригинале, и наоборот.

Для присвоения по ссылке, просто добавьте амперсанд (&) к началу имени присваиваемой (исходной) переменной. Например, следующий фрагмент кода дважды выводит ‘ Меня зовут Боб ‘:

Важно отметить, что по ссылке могут быть присвоены только именованные переменные.

function test ()
<
return 25 ;
>

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

User Contributed Notes 6 notes

This page should include a note on variable lifecycle:

Before a variable is used, it has no existence. It is unset. It is possible to check if a variable doesn’t exist by using isset(). This returns true provided the variable exists and isn’t set to null. With the exception of null, the value a variable holds plays no part in determining whether a variable is set.

Setting an existing variable to null is a way of unsetting a variable. Another way is variables may be destroyed by using the unset() construct.

The first time that a variable is used in a scope, it’s automatically created. After this isset is true. At the point at which it is created it also receives a type according to the context.

= true ; // a boolean
$a_str = ‘foo’ ; // a string
?>

If it is used without having been given a value then it is uninitalized and it receives the default value for the type. The default values are the _empty_ values. E.g Booleans default to FALSE, integers and floats default to zero, strings to the empty string », arrays to the empty array.

A variable can be tested for emptiness using empty();

= 0 ; //This isset, but is empty
?>

Unset variables are also empty.

= array();
//Now isset($item) returns true. But isset($item[‘unicorn’]) is false.
//empty($item) is true, and so is empty($item[‘unicorn’]

$item [ ‘unicorn’ ] = » ;
//Now isset($item[‘unicorn’]) is true. And empty($item) is false.
//But empty($item[‘unicorn’]) is still true;

$item [ ‘unicorn’ ] = ‘Pink unicorn’ ;
//isset($item[‘unicorn’]) is still true. And empty($item) is still false.
//But now empty($item[‘unicorn’]) is false;
?>

For arrays, this is important because accessing a non-existent array item can trigger errors; you may want to test arrays and array items for existence with isset before using them.

Источник

Как устроены переменные в PHP

Вроде простой вопрос, даже не понятно что на него ответить, правда?
Мы все знаем как создать переменную, как получить значение переменной, как взять ссылку на переменную в конце концов.
Но как они работают изнутри?
Что происходит в интерпретаторе, когда вы изменяете значение переменной? Или когда удаляете ее?
Как реализованы типы переменных?

В этой статье я постараюсь раскрыть именно эти темы.

Abstract

Переменные в PHP выражены в виде неких контейнеров, которые хранят в себе тип переменной, значение, кол-во ссылающихся переменных на этот контейнер, и флаг — является ли эта переменная ссылочной.

63a169c15075b9ff73b74949d43c2401

Отступление про структуры и указатели

Если вы никогда не писали на Си, то возможно не знаете про такие вещи, как структуры и указатели, которые очень широко тут используются и без которых пожалуй было бы очень сложно представить себе хоть сколько нибудь сложную программу на Си.
Структуры очень похожи на классы, только они не могут иметь методов, только данные, указатели на данные и указатели на функции. Объявляя структуру в Си, вы определяете тип данных, и теперь при определении переменной, вы можете написать имя этой структуры на месте типа той переменной, примерно так:

Указатели — это как переменные-ссылки, только их значение — это адрес в памяти. На самом деле, это ссылки как указатели, только они ведут себя как разыменованные указатели. Лучше показать на коде:

31f2f227eb73e3013c4849c7c49477d9

Контейнеры

Контейнером служит структура под названием zval, она выглядит так:

В итоге, когда вы будете создавать переменную этого типа, она займет в памяти ровно столько, сколько занимает самый тяжелый элемент юниона.
1cd5de29b4c6db55b384c5a9589f200b

Зачем столько лишнего?

Теперь разберем — зачем тут, например, какой-то refcount?
А очень просто: когда вы присваиваете переменной значение другой переменной, то они обе ссылаются на один zval, а refcount инкрементируется.
56604b17c73cdbca1e9892966bc2083a
(оригинал с собачкой тут)

Теперь, если вы захотите изменить значение одной из этих переменных, то PHP, увидя refcount больше 1, скопирует этот zval, сделает изменения там, и ваша переменная будет указывать уже на новый zval.
Если это немного формализовать, то это будет выглядеть примерно так:

PHP Под капотом

Эта техника называется copy on write и она позволяет неплохо снизить потребление памяти.
Также, refcount нужен сборщику мусора, который удаляет из памяти все zval-ы, у которых refcount = 0.

А что делать с ссылками и зачем вообще этот is_ref?

А что происходит со ссылками? Все очень просто: если вы создаете ссылку от переменной, то флаг is_ref становится равным 1, и больше вышеописанная оптимизация для этого zval-а применяться не будет. Поясню кодом:

PHP Под капотом

Конечно, если вы возьмете еще одну ссылку от foo, то refcount zval-а, на который ссылается foo, увеличится на один.

Пожалуй на этом (пока?) все, в следующей части поговорим о массивах.

PS не знаю кто как воспримет эти картинки, мне показалось это будет забавно 🙂 к сожалению сканера у меня нет

Источник

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

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

Присвоение имени и создание переменной в PHP

Посмотрим на некоторые допустимые и недопустимые имена переменных PHP :

Присвоение значения переменной РНР

Начнем с присвоения слова « Круг » переменной с именем myShape :

Мы объявили переменную с именем myShape и присвоили ей строковое значение « Круг «. Аналогичным образом можно объявить переменную, содержащую численное значение:

Доступ к PHP значениям переменных

Это приведет к следующему выводу в браузере:

Точно так же можно отобразить значение переменной myShape :

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

То, что нам нужно в этом случае выводится следующим образом:

Можно обойти эту проблему, поставив фигурные скобки (< >) вокруг имени переменной, чтобы экранировать ее от других символов:

Что дает нам желаемый результат:

Изменение типа РНР переменной

PHP типы переменных: целое, вещественное, логическое, массив, объект и строка. Для начала рассмотрим изменение типа переменной после ее создания.

Процесс динамического изменения типа переменной называется автоматическим преобразованием типов.

Проверка установлена ли переменная

Источник

Переменные в PHP

Что такое переменная

Например, если у нас есть HTML страница, на которой необходимо время от времени менять определённое значение, мы можем для удобства вынести это значение в переменную:

При запуске этого кода в конец тега

Создание переменной

Положить значение в переменную можно так:

Название «переменная» означает, что её значение может меняться во время выполнения скрипта:

Тем не менее, веб-разработчики часто говорят «объявить переменную» вместо «создать переменную».

Также вместо «положить в переменную значение» часто говорят «присвоить значение».

Правила именования переменных

Вывод переменной

Вывести переменную можно с помощью команды echo :

При этом команда echo позволяет вывести на экран сразу несколько значений:

В примере выше мы передали в echo 2 значения, разделив их запятой.

Так мы можем передать сколько угодно значений:

Проверка значения переменной

Команда echo не всегда удобна для проверки значения переменной.

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

Поэтому для проверки содержимого переменной лучше использовать функцию var_dump() :

Как видно из примера выше, функция var_dump() выводит содержимое переменной, её длину и тип.

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

Удаление переменной

Удалить существующую переменную можно с помощью функции unset() :

А теперь пришло время немного попрактиковаться.

Задача №1

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

Задача №2

1. Создайте переменную title и присвойте ей какое-нибудь значение.
2. Выведите значение переменной на экран внутри тега h1.
3. Измените значение переменной на какое-нибудь другое.
4. Снова выведите переменную на экран, теперь уже внутри тега div.
5. Удалите переменную title.

Источник

Моя дача
Adblock
detector