Есть ли в php указатели? - PullRequest
48 голосов
/ 14 апреля 2009

Что означает этот код? Вы так объявляете указатель в php?

$this->entryId = $entryId;

Ответы [ 9 ]

156 голосов
/ 14 апреля 2009

Имена переменных в PHP начинаются с $, поэтому $ entryId - это имя переменной. $ это специальная переменная в объектно-ориентированном программировании на PHP, которая является ссылкой на текущий объект. -> используется для доступа к члену объекта (например, свойствам или методам) в PHP, как синтаксис в C ++. поэтому ваш код означает это:

Поместите значение переменной $ entryId в поле entryId (или свойство) этого объекта.

Оператор & в PHP означает передачу ссылки. Вот пример:

$b=2;
$a=$b;
$a=3;
print $a;
print $b;
// output is 32

$b=2;
$a=&$b; // note the & operator
$a=3;
print $a;
print $b;
// output is 33

В приведенном выше коде, поскольку мы использовали оператор &, ссылка на то, куда указывает $ b, хранится в $ a. Таким образом, $ a на самом деле является ссылкой на $ b.

В PHP аргументы передаются по значению по умолчанию (на основе C). Поэтому при вызове функции при передаче значений они копируются по значению, а не по ссылке. Это по умолчанию в большинстве ситуаций. Однако есть способ пройти мимо ссылочного поведения при определении функции. Пример:

function plus_by_reference( &$param ) {
      // what ever you do, will affect the actual parameter outside the function
      $param++;
}

$a=2;
plus_by_reference( $a );
echo $a;
// output is 3

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

Однако есть кое-что интересное. Поскольку режим передачи по значению может привести к большему использованию памяти, а PHP является интерпретируемым языком (поэтому программы, написанные на PHP, не так быстры, как скомпилированные программы), чтобы заставить код работать быстрее и минимизировать использование памяти, существуют некоторые изменения в интерпретаторе PHP. Один ленивый (я не уверен насчет названия). Что означает это:

Когда вы копируете переменную в другую, PHP скопирует ссылку на первую переменную во вторую переменную. Таким образом, ваша новая переменная на самом деле является ссылкой на первую переменную до сих пор. Значение еще не скопировано. Но если вы попытаетесь изменить любую из этих переменных, PHP создаст копию значения, а затем изменит переменную. Таким образом, у вас будет возможность сэкономить память и время, ЕСЛИ ВЫ НЕ ИЗМЕНИТЕ ЗНАЧЕНИЕ.

Итак:

$b=3;
$a=$b;
// $a points to $b, equals to $a=&$b
$b=4;
// now PHP will copy 3 into $a, and places 4 into $b

После всего этого, если вы хотите поместить значение $ entryId в свойство entryId вашего объекта, приведенный выше код сделает это и не будет копировать значение entryId до тех пор, пока вы не измените какой-либо из них. при меньшем использовании памяти. Если вы действительно хотите, чтобы они оба указывали на одно и то же значение, используйте это:

$this->entryId=&$entryId;
24 голосов
/ 27 августа 2013

Нет, как говорили другие: «В PHP нет указателя». и я добавляю, что в PHP нет ничего RAM_related.

А также все ответы ясны. Но были моменты, которые я не мог устоять!

Есть ряд вещей, которые действуют аналогично указателям

  • eval construct (мой любимый и тоже опасный)
  • $ GLOBALS переменная
  • Дополнительный знак '$' перед переменными (как упомянуто prathk )
  • Ссылки

Первый

Сначала я должен сказать, что PHP - действительно мощный язык, зная, что есть конструкция с именем "eval", так что вы можете создавать свой код PHP во время его работы! (действительно круто!)

хотя существует опасность PHP_Injection, которая гораздо более разрушительна, чем SQL_Injection. Осторожно!

пример:

Код:

$a='echo "Hello World.";';
eval ($a);

выход

Hello World.

Таким образом, вместо использования указателя в качестве другой переменной, Вы можете создать переменную с нуля !


Второй

$ GLOBAL переменная очень полезна, вы можете получить доступ ко всем переменным, используя ее ключи.

пример:

Код:

$three="Hello";$variable=" Amazing ";$names="World";
$arr = Array("three","variable","names");
foreach($arr as $VariableName)
    echo $GLOBALS[$VariableName];

выход

Hello Amazing World

Примечание: Другие суперглобальные могут выполнить тот же трюк в меньших масштабах.


Третий

Вы можете добавить столько, сколько хотите, $ перед переменной, если вы знаете, что делаете.

пример:

Код:

$a="b";
$b="c";
$c="d";
$d="e";
$e="f";

echo $a."-";
echo $$a."-";   //Same as $b
echo $$$a."-";  //Same as $$b or $c
echo $$$$a."-"; //Same as $$$b or $$c or $d
echo $$$$$a;    //Same as $$$$b or $$$c or $$d or $e

выход

B-C-D-E-F


Последний

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

пример 1:

Код:

$a="Hello";
$b=&$a;
$b="yello";
echo $a;

выход

Yello

пример 2:

Код:

function junk(&$tion)
{$GLOBALS['a'] = &$tion;}
$a="-Hello World<br>";
$b="-To You As Well";
echo $a;
junk($b);
echo $a;

выход

- Привет, Мир

-Тебе же хорошо

Надеюсь, это поможет.

9 голосов
/ 14 апреля 2009

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

Синтаксис, который вы цитируете, в основном такой же, как и доступ к члену из указателя на класс в C ++ (тогда как точечная нотация используется, когда он не является указателем.)

3 голосов
/ 14 апреля 2009

Чтобы ответить на вторую часть вашего вопроса - в PHP нет указателей.

При работе с объектами вы обычно передаете по ссылке, а не по значению - поэтому в некоторых случаях это работает как указатель, но в целом полностью прозрачно.

Это зависит от версии PHP, которую вы используете.

2 голосов
/ 11 сентября 2015

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

class pointer {
   var $child;

   function pointer(&$child) {
       $this->child = $child;
   }

   public function __call($name, $arguments) {
       return call_user_func_array(
           array($this->child, $name), $arguments);
   }
}

Используйте вот так:

$a = new ClassA();

$p = new pointer($a);

Если вы передадите $ p, он будет вести себя как указатель C ++ относительно вызовов методов (вы не можете напрямую трогать переменные объекта, но это в любом случае зло)

2 голосов
/ 25 мая 2013

Да, в PHP есть что-то похожее на указатели, но оно может не совпадать с тем, что происходит в c или c ++. Ниже приведен один из примеров.

$a = "test";
$b = "a";
echo $a;
echo $b;
echo $$b;

//output
test
a
test

Это иллюстрирует похожую концепцию указателей в PHP.

2 голосов
/ 14 апреля 2009

entryId является свойством экземпляра текущего класса ($ this) И $ entryId является локальной переменной

0 голосов
/ 25 апреля 2010

PHP может использовать что-то вроде указателей:

$y=array(&$x);

Теперь $ y действует как указатель на $ x, а $ y [0] разыменовывает указатель.

Массив значений (& $ x) является просто значением, поэтому его можно передавать в функции, сохранять в других массивах, копировать в другие переменные и т. Д. Вы даже можете создать указатель на эту переменную-указатель. (Однако при сериализации он сломает указатель.)

0 голосов
/ 14 апреля 2009

PHP передает массивы и объекты по ссылке (указатели). Если вы хотите передать нормальную переменную Ex. $ var = 'boo'; затем используйте $ boo = & $ var;.

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