2012-01-22 4 views
0

Может кто-нибудь сказать мне, почему это возможно? Частный атрибут должен быть изменен только для самого класса. s :: $ c читается (getC()), но почему я могу писать на него?Почему вы можете изменить значение частных атрибутов (которые являются объектами)?

<?php 

class s{ 

    private $c; 

    public function __construct() { 
     $this->c = new t; 
    } 

    public function getC() { 
     return $this->c; 
    } 

} 

class t { 

    public $a = 1; 
    public $b = 2; 

} 

$x = new s(); 

$x->getC()->a = 5; 

echo $x->getC()->a; 
?> 

Выход: 5

ответ

3

когда PHP возвращает объект не дублировать его, она возвращает указатель (ссылку) на объект в памяти. поэтому каждое изменение, которое вы сделаете, повлияет на исходный объект.

для того, чтобы предотвратить его можно клонировать объект перед возвращением его

public function getC() { 
    return clone $this->c; 
} 
+0

OK это имеет смысл ... Но если я верну массив, это всегда копия, не так ли? –

+0

Да, так работает php (в отличие от языков, таких как java, например, где все типы, кроме базовых [int, char, byte и т. Д.] Передаются по ссылке), в php только объекты проходят по ссылке. если вы хотите передать массив по ссылке add & before имя var, то i.e 'function changeArray (& $ array) {...}' –

5

Вы подвержены $c, делая getC() метод общественности. Теперь любой/любой может получить доступ к $c с помощью функции getC(), и любой может всегда иметь доступ к $a, так как он был публичным в первую очередь.


Если вы хотите значение $a и $b класса t быть только для чтения, то вы можете их частные, каждый с акцесором как getA() и getB(). Например:

class s { 
    private $c; 

    public function __construct() { 
     $this->c = new t; 
    } 

    public function getC() { 
     return $this->c; 
    } 
} 

class t { 
    private $a = 1; 
    private $b = 2; 

    public function getA() { 
     return $this->a; 
    } 

    public function getB() { 
     return $this->b; 
    } 
} 
1

Это ожидаемое поведение.

«Частный» означает, что вы не можете использовать $x->c напрямую. $x->getC() - это функция s, и, таким образом, доступ к частным членам s. getC является общедоступным, поэтому вы можете назвать этот метод в любом месте.

Короче говоря, поскольку вы выставили getC («getter» для C), вы можете прочитать значение C где угодно. Что вы не может do is $x->getC() = 2;.

Смежные вопросы