2015-05-12 2 views
0
xPostModel Object 
(
[script:Model:private] => abc 
) 

Я хочу изменить abc на efg, как я могу это сделать? Там в любом случае ?Как получить доступ к закрытому члену класса?

+0

Где это необходимо изменить? Вы можете изменить его непосредственно только в самом классе, поэтому, если вам нужно изменить его вне класса, вам понадобится сделать для него метод setter в классе. – Haprog

+0

на самом деле у меня нет доступа .. я могу только сделать его объектом .. –

+0

Вы также можете использовать Reflection для этого, но это не должно считаться хорошей практикой в ​​обычных ситуациях. Вы можете увидеть пример здесь: http://stackoverflow.com/a/6448613/1362634 – Haprog

ответ

1

Если вы не можете внести изменения в определение класса, и для свойства класса нет общедоступного метода setter, и вам действительно нужно иметь возможность напрямую редактировать свойство вне класса, то ваш единственный вариант, вероятно, использует Reflection методы, смотри пример здесь: https://stackoverflow.com/a/6448613/1362634

Вот пример, который должен работать в вашем случае, чтобы установить частную собственность $script в $obj типа xPostModel (где свойство наследуется от родительского класса Model):

$obj = new xPostModel(); 
$refProperty = new ReflectionProperty('Model', 'script'); 
$refProperty->setAccessible(true); 
$refProperty->setValue($obj, 'def'); 

И вот пример полностью работающего кода с определениями класса макета, чтобы имитировать ситуацию вопроса.

<?php 
error_reporting(-1); 
ini_set('display_errors', 1); 

class Model { 
    private $script = 'abc'; 
} 

class xPostModel extends Model {} 

$obj = new xPostModel(); 

print_r($obj); // Check original value of inherited private property 

$refProperty = new ReflectionProperty('Model', 'script'); 
$refProperty->setAccessible(true); 
$refProperty->setValue($obj, 'def'); 

print_r($obj); // Check that property has been changed 
Смежные вопросы