Что в php означает
The basic assignment operator is «=». Your first inclination might be to think of this as «equal to». Don’t. It really means that the left operand gets set to the value of the expression on the right (that is, «gets set to»).
The value of an assignment expression is the value assigned. That is, the value of » $a = 3 » is 3. This allows you to do some tricky things:
$a = ( $b = 4 ) + 5 ; // $a is equal to 9 now, and $b has been set to 4.
In addition to the basic assignment operator, there are «combined operators» for all of the binary arithmetic, array union and string operators that allow you to use a value in an expression and then set its value to the result of that expression. For example:
$a = 3 ;
$a += 5 ; // sets $a to 8, as if we had said: $a = $a + 5;
$b = «Hello » ;
$b .= «There!» ; // sets $b to «Hello There!», just like $b = $b . «There!»;
Note that the assignment copies the original variable to the new one (assignment by value), so changes to one will not affect the other. This may also have relevance if you need to copy something like a large array inside a tight loop.
An exception to the usual assignment by value behaviour within PHP occurs with object s, which are assigned by reference. Objects may be explicitly copied via the clone keyword.
Assignment by Reference
Assignment by reference is also supported, using the » $var = &$othervar; » syntax. Assignment by reference means that both variables end up pointing at the same data, and nothing is copied anywhere.
Пример #1 Assigning by reference
$a = 3 ;
$b = & $a ; // $b is a reference to $a
?php
print » $a \n» ; // prints 3
print » $b \n» ; // prints 3
$a = 4 ; // change $a
print » $a \n» ; // prints 4
print » $b \n» ; // prints 4 as well, since $b is a reference to $a, which has
// been changed
?>
The new operator returns a reference automatically, as such assigning the result of new by reference is an error.
Результат выполнения данного примера:
Parse error: syntax error, unexpected 'new' (T_NEW) in …
More information on references and their potential uses can be found in the References Explained section of the manual.
Arithmetic Assignment Operators
| Example | Equivalent | Operation |
|---|---|---|
| $a += $b | $a = $a + $b | Addition |
| $a -= $b | $a = $a — $b | Subtraction |
| $a *= $b | $a = $a * $b | Multiplication |
| $a /= $b | $a = $a / $b | Division |
| $a %= $b | $a = $a % $b | Modulus |
| $a **= $b | $a = $a ** $b | Exponentiation |
Bitwise Assignment Operators
| Example | Equivalent | Operation |
|---|---|---|
| $a &= $b | $a = $a & $b | Bitwise And |
| $a |= $b | $a = $a | $b | Bitwise Or |
| $a ^= $b | $a = $a ^ $b | Bitwise Xor |
| $a | $a = $a | Left Shift |
| $a >>= $b | $a = $a >> $b | Right Shift |
Other Assignment Operators
| Example | Equivalent | Operation |
|---|---|---|
| $a .= $b | $a = $a . $b | String Concatenation |
| $a ??= $b | $a = $a ?? $b | Null Coalesce |
Смотрите также
- arithmetic operators
- bitwise operators
- null coalescing operator
User Contributed Notes 7 notes
12 years ago
Using $text .= «additional text»; instead of $text = $text .»additional text»; can seriously enhance performance due to memory allocation efficiency.
I reduced execution time from 5 sec to .5 sec (10 times) by simply switching to the first pattern for a loop with 900 iterations over a string $text that reaches 800K by the end.
8 years ago
Be aware of assignments with conditionals. The assignment operator is stronger as ‘and’, ‘or’ and ‘xor’.
$x = true and false ; //$x will be true
$y = ( true and false ); //$y will be false
?>
16 years ago
bradlis7 at bradlis7 dot com’s description is a bit confusing. Here it is rephrased.
echo $a , «\n» , $b ; ?>
outputs
Because the assignment operators are right-associative and evaluate to the result of the assignment
$a .= $b .= «foo» ;
?>
is equivalent to
$a .= ( $b .= «foo» );
?>
and therefore
$b .= «foo» ;
$a .= $b ;
?>
5 months ago
8 years ago
PHP uses a temporary variable for combined assign-operators (unlike JavaScript), therefore the left-hand-side (target) gets evaluated last.
Meaning:
$a = ($b + $c) + $a;
This can be important if the target gets modified inside the expression.
$a = 0;
$a += (++$a) + (++$a); // yields 5 (instead of 4)
9 years ago
Document says:
«An exception to the usual assignment by value behaviour within PHP occurs with objects, which are assigned by reference in PHP 5. Objects may be explicitly copied via the clone keyword.»
But it’s not very accurate! Considering this code:
$a = new StdClass ;
$b = $a ;
$a = new StdClass ;
var_dump ( $a , $b );
?>
Output:
object(stdClass)#2 (0) >
object(stdClass)#1 (0) >
Note: #2 and #1 means two different objects.
But this code:
$a = new StdClass ;
$b = & $a ;
$a = new StdClass ;
var_dump ( $a , $b );
?>
Output will be:
object(stdClass)#2 (0) >
object(stdClass)#2 (0) >
Note: Still pointing to the same object.
And this shows that that exception is not valid, PHP assignment for objects still makes a copy of variable and does not creates a real reference, albeit changing an object variable members will cause both copies to change.
So, I would say assignment operator makes a copy of ‘Object reference’ not a real object reference.
Что значит знак «->» в PHP?
Добрый день, Подскажите пожалуйста начинающему, что значит знак «->» в PHP? Гуголю знак не поддается ( Например как интерпритировать выражение: if ( $use_desc_for_title == 0 || empty($category->description) ) Спасибо
На сайте с 15.12.2005
25 декабря 2013, 22:59
Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
На сайте с 07.12.2013
25 декабря 2013, 23:18
edogs:
http://www.php.net/manual/ru/language.oop5.properties.php
Большущее спасибо за оперативный ответ. Хоть понятно в какую сторону думать. и все же для наглядности «переведите» ))) пожалуйста с php на обывательский/человеческий условие if ( empty($category->description) ) ? ПС: Тапками не закидывайте пожалуйста — пытаюсь испортить первый шаблон Вордпресс 🙂 — по пути операторы php «с нуля » пытаюсь разобрать. Образование — Бейсик облегченный 🙂
На сайте с 04.07.2010
25 декабря 2013, 23:28
Переменная $category имеет свой массив, в ней есть аргумент description, то есть конструкция $category->description сразу обращается к этому аргументу. Можно еще $category[0][3] тоже самое что и $category->description
На сайте с 07.12.2013
25 декабря 2013, 23:39
AGRESSOR:
Переменная $category имеет свой массив, в ней есть аргумент description, то есть конструкция $category->description сразу обращается к этому аргументу.
Можно еще $category[0][3] тоже самое что и $category->description
Выражения
Выражения — это самые важные строительные элементы PHP. Почти всё, что вы пишете в PHP, является выражением. Самое простое и точное определение выражения — «все что угодно, имеющее значение».
Основными формами выражений являются константы и переменные. Если вы записываете $a = 5 , вы присваиваете 5 переменной $a . 5 , очевидно, имеет значение 5 или, другими словами, 5 — это выражение со значением 5 (в данном случае 5 — это целочисленная константа).
После этого присвоения вы ожидаете, что значением $a также является 5, поэтому, если вы написали $b = $a , вы полагаете, что работать это будет так же, как если бы вы написали $b = 5 . Другими словами, $a это также выражение со значением 5. Если всё работает верно, то именно так и произойдёт.
Немного более сложными примерами выражений являются функции. Например, рассмотрим следующую функцию:
function foo ()
return 5 ;
>
?>?php
Исходя из того, что вы хорошо знакомы с концепцией функций (если нет, то прочитайте главу о функциях), вы полагаете, что запись $c = foo() абсолютно эквивалентна записи $c = 5 , и вы правы. Функции — это выражения, значением которых является то, что возвращает функция. Поскольку foo() возвращает 5, значением выражения ‘ foo() ‘ является 5. Как правило, функции возвращают не просто статическое значение, а что-то вычисляют.
Разумеется, значения в PHP не обязаны быть целочисленными, и очень часто ими не являются. PHP поддерживает четыре типа скалярных значений: целочисленные ( int ), с плавающей точкой ( float ), строковые значения ( string ) и булевы ( bool ) значения (скалярными являются значения, которые вы не можете ‘разбить’ на меньшие части, в отличие, например, от массивов). PHP поддерживает также два комбинированных (не скалярных) типа: массивы и объекты. Любое значение такого типа может присваиваться переменной или возвращаться функцией.
Однако PHP, как и многие другие языки, понимает гораздо больше выражений. PHP — это язык, ориентированный на выражения и рассматривающий почти все как выражение. Вернёмся к примеру, с которым мы уже имели дело: $a = 5 . Легко заметить, что здесь присутствуют два значения — значение целочисленной константы 5 и значение переменной $a , также принимающей значение 5. Но на самом деле здесь присутствует и ещё одно значение — значение самого присвоения. Само присвоение вычисляется в присвоенное значение, в данном случае — в 5. На практике это означает, что $a = 5 , независимо от того, что оно делает, является выражением со значением 5. Таким образом, запись $b = ($a = 5) равносильна записи $a = 5; $b = 5; (точка с запятой обозначает конец выражения). Поскольку операции присвоения анализируются справа налево, вы также можете написать $b = $a = 5 .
Другой хороший пример ориентированности на выражения — префиксный и постфиксный инкремент и декремент. Пользователи PHP и многих других языков возможно уже знакомы с формой записи variable++ и variable— . Это операторы инкремента и декремента. Также как и C, PHP поддерживает два типа инкремента — префиксный и постфиксный. Они оба инкрементируют значение переменной и эффект их действия на неё одинаков. Разница состоит в значении выражения инкремента. Префиксный инкремент, записываемый как ++$variable , вычисляется в инкрементированное значение (PHP инкрементирует переменную до того как прочесть её значение, отсюда название ‘пре-инкремент’). Постфиксный инкремент, записываемый как $variable++ , вычисляется в первоначальное значение переменной $variable до её приращения (PHP инкрементирует переменную после прочтения её значения, отсюда название ‘пост-инкремент’).
Очень распространённым типом выражений являются выражения сравнения. Результатом вычислений являются false (ложь) или true (истина). PHP поддерживает операции сравнения > (больше), >= (больше либо равно), == (равно), != (не равно), < (меньше) и
Последний пример выражений, который мы здесь рассмотрим, это смешанные выражения операции и присвоения. Вы уже знаете, что если вы хотите увеличить $a на 1, вы можете просто написать $a++ или ++$a . Но что, если вы хотите прибавить больше, чем единицу, например, 3? Вы могли бы написать $a++ много раз, однако, очевидно это не очень рациональный и удобный способ. Гораздо более распространённой практикой является запись вида $a = $a + 3 . $a + 3 вычисляется в значение $a плюс 3 и снова присваивается $a , увеличивая в результате $a на 3. В PHP, как и в некоторых других языках, таких как C, вы можете записать это более коротким образом, что увеличит очевидность смысла и быстроту понимания кода по прошествии времени. Прибавить 3 к текущему значению $a можно с помощью записи $a += 3 . Это означает дословно «взять значение $a , прибавить к нему 3 и снова присвоить его переменной $a «. Кроме большей понятности и краткости, это быстрее работает. Значением $a += 3 , как и обычного присвоения, является присвоенное значение. Обратите внимание, что это НЕ 3, а суммированное значение $a плюс 3 (то, что было присвоено $a ). Таким образом может использоваться любой бинарный оператор, например, $a -= 5 (вычесть 5 из значения $a ), $b *= 7 (умножить значение $b на 7) и т.д.
Существует ещё одно выражение, которое может выглядеть необычно, если вы не встречали его в других языках — тернарный условный оператор:
$first ? $second : $third
?>?php
Если значением первого подвыражения является true (не ноль), то выполняется второе подвыражение, которое и будет результатом условного выражения. В противном случае будет выполнено третье подвыражение и его значение будет результатом.
Следующий пример должен помочь вам немного улучшить понимание префиксного и постфиксного инкремента и выражений:
function double ( $i )
return $i * 2 ;
>
$b = $a = 5 ; /* присвоить значение пять переменным $a и $b */
$c = $a ++; /* постфиксный инкремент, присвоить значение $a
(5) переменной $c */
$e = $d = ++ $b ; /* префиксный инкремент, присвоить увеличенное
значение $b (6) переменным $d и $e */
?php
/* в этой точке и $d, и $e равны 6 */
$f = double ( $d ++); /* присвоить удвоенное значение $d перед
инкрементом (2*6 = 12) переменной $f */
$g = double (++ $e ); /* присвоить удвоенное значение $e после
инкремента (2*7 = 14) переменной $g */
$h = $g += 10 ; /* сначала переменная $g увеличивается на 10,
приобретая, в итоге, значение 24. Затем значение
присвоения (24) присваивается переменной $h,
которая в итоге также становится равной 24. */
?>
Некоторые выражения могут рассматриваться как инструкции. В данном случае инструкция имеет вид ‘ expr ; ‘ — выражение с последующей точкой с запятой. В записи $b = $a = 5; , $a = 5 — это верное выражение, но само по себе не инструкция. Тогда как $b = $a = 5; является верной инструкцией.
Последнее, что стоит упомянуть, это истинность значения выражений. Во многих случаях, как правило, в условных операторах и циклах, вас может интересовать не конкретное значение выражения, а только его истинность (значение true или false ). Константы true и false (регистронезависимые) — это два возможных булевых значения. При необходимости выражение автоматически преобразуется в булев тип. Подробнее о том, как это происходит, смотрите в разделе о приведении типов.
PHP предоставляет полную и мощную реализацию выражений, и их полное документирование выходит за рамки этого руководства. Вышеприведённые примеры должны дать вам представление о том, что они из себя представляют и как вы сами можете создавать полезные выражения. Далее, для обозначения любого верного выражения PHP в этой документации мы будем использовать сокращение expr .
Что в php означает знак ->
В мануале он называется «object operator» — T_OBJECT_OPERATOR. Используется видимо для вызова нестатических методов класса.
Method chaining is read left to right (left associative): public function Two() < echo "Two" . PHP_EOL; return $this; >public function Three() < echo "Three" . PHP_EOL; return $this; >> $test = new Test_Method_Chain(); $test->One()->Two()->Three(); /* Ouputs: One Two Three */ ?>
Отслеживать
ответ дан 13 сен 2012 в 17:52
7,786 1 1 золотой знак 28 28 серебряных знаков 49 49 бронзовых знаков
13 сен 2012 в 17:55
Запись $test->One()->Two()->Three() возможна, потому что вызываемые методы возвращают объект того же класса. Где попало подобный вызов работать не будет. Так же такой вариант использование доступен только с определенной версии php(наверное с 5.3), ранее разыменовывание объекта(получение ссылки на него) в таком виде было недоступно и требовало ввода дополнительной промежуточной переменной. $a = $test->One(); $b = $a->Two(); $c = $b->Three();
14 сен 2012 в 2:35
Да. Именно так. Для вызова методов и свойств. В жаве и c# если не ошибаюсь это точка.
Отслеживать
ответ дан 13 сен 2012 в 18:46
208 2 2 серебряных знака 13 13 бронзовых знаков
И в javascript
13 сен 2012 в 18:56
и в delphi точка, а вот в С++ как и в php ->
13 сен 2012 в 19:53
@savro Зря вы так про C++ 🙂
13 сен 2012 в 19:58
myclass.method() — это C++, не путайте человека. myclass->method() тоже C++, но здесь myclass это указатель, а не объект и не ссылка.
13 сен 2012 в 20:00
Небольшой учебный сниппет наглядно иллюстрирующий высказывания предыдущих авторов о C++ myclass myclassobject; myclass* myclassobjectpointer=&myclassobject; myclassobject.method(); myclassobjectpointer->method(); myclass::staticmethod();
13 сен 2012 в 20:22
Он используется не только для вызова нестатических методов, но и для обращения к свойствам(полям) объекта(а не класса).
Вообще, на сколько я знаю, повелось это из С++. Вначале был объект. Затем у него появилось свойство и обращаться к нему надо было так объект.свойство. Все бы хорошо, но порой нужно было получать не значение свойства, а указатель на него, так появилась запись объект.свойство Данная запись многим показалась некрасивой и ее заменили на объект->свойство. Т.е. в С++ «->» эквивалентно «.«, ну а в php видимо перекочевал уже конечный вариант.
PS: вот как-то, но возможно я немного ошибаюсь.
Отслеживать
ответ дан 14 сен 2012 в 2:29
1,936 7 7 золотых знаков 28 28 серебряных знаков 47 47 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
