PHP константные ссылки - PullRequest
       2

PHP константные ссылки

2 голосов
/ 22 января 2011

Я - программист среднего уровня C ++ и знаю, что вы можете передать постоянную ссылку в качестве параметра, чтобы предотвратить редактирование реальной переменной. Мне было интересно, смогу ли я сделать это на PHP?

Ответы [ 3 ]

5 голосов
/ 22 января 2011

Нет, в PHP нет эквивалента квалификатору const в C ++.

1 голос
/ 22 января 2011

Это то, о чем вы говорите:

<?php
    $a = 10;
    function foo($p_a) {
        // passing by value is the default
        $p_a++;
    }
    foo($a);
    echo $a; // prints 10

    $a = 10;
    function bar(&$p_a) {
        //-------^ passing by reference
        $p_a++;
    }
    bar($a);
    echo $a; // prints 11
?>
0 голосов
/ 11 июля 2011

@ Salman A, который работает только для скаляров, поведение отличается для объектов, когда они передаются по ссылке или нет.Похоже, что нет никакой реальной разницы между этими двумя методами!

<?php

class X
{
    static $instances = 0;

    public $instance;
    public $str;

    function __construct($str)
    {
        $this->instance = ++self::$instances;
        $this->str = $str;
    }

    public function __toString()
    {
        return "instance: ".$this->instance." str: ".$this->str;
    }
}

class Y extends X
{
    public function __toString()
    {
        return "Y:".parent::__toString();
    }
}

// Pass NORMAL
function modify_1($o)
{
    $o->str = __FUNCTION__;
}

// Pass BY-REFERENCE
function modify_2(&$o)
{
    $o->str = __FUNCTION__;
}

// Pass NORMAL - Obj Replace
function modify_3($o)
{
    $o = new Y(__FUNCTION__);
}

// Pass BY-REFERENCE - Obj Replace
function modify_4(&$o)
{
    $o = new Y(__FUNCTION__);
}

$x = new X('main');
echo "$x\n";

modify_1($x);
echo "$x\n";

modify_2($x);
echo "$x\n";

modify_3($x);
echo "$x\n";

modify_4($x);
echo "$x\n";

Это сгенерировало вывод ниже;

instance: 1 str: main
instance: 1 str: modify_1
instance: 1 str: modify_2
instance: 1 str: modify_2
Y:instance: 3 str: modify_4

Я ожидал

instance: 1 str: main
instance: 1 str: main
instance: 1 str: modify_2
instance: 1 str: modify_2
Y:instance: 3 str: modify_4

Итак, мой вывод таков;похоже, это работает, если мы имеем дело с объектом (самим собой) или скаляром;но не свойство объекта или его метод.

...