2016-07-08 3 views
0

Вопрос очень прост. Как я мог использовать somthing как $obj->A::a где A::a - это постоянная строка, которая является именем одного из obj?

Давайте посмотрим на этот простой код:

class A{ 
const a='b'; 
} 
class B{ 
    public $b='somthing'; 
} 

$k='b'; 
$obj=new B(); 

Теперь оба эти коды равны:

var_dump(A::a); //==string(1) "b" 
var_dump($k); //==string(1) "b" 

Теперь я могу использовать ниже код, эхо $ OBJ -> $ к; // Выход: Somthing Но этот код не работает:

echo $obj->A::a; //Error 

мне нужно что-то похожее на приведенном выше код, потому что у меня есть много const т аналогичных.

Не стесняйтесь для редактирования названия, действительно, я не знаю, как это назвать!

+3

'echo $ obj -> {A :: a};' выполнит работу, которую вы ищете, если у меня возникнет вопрос. – briosheje

+0

да это. + 1 человек. –

ответ

1

Это просто потому, что класс B не имеет никакого общественного атрибут A. Таким образом, вы не можете получить доступ к нему, который является то, что вы пытаетесь сделать, выполнив $obj->A , Это логично, если вы думаете о порядке вызовов, когда вы делаете что-то вроде $obj->methodA()->methodB().

Правильный способ доступа к нему - довольно $obj->{A::a}.

1

вы имеете в виду что-то вроде:

$x = A::a; 
echo $obj->$x; 
+0

Это сработает, и я нашел ответ в любопытной манере. благодаря вашему ответу. вы можете увидеть мой ответ –

+0

, вы должны отметить ответ от Matt как решил – fehrlich

+0

Я сделал, но stackoverflow сказал, подождите минуту. –

0

Я сам нашел ответ. Ответ очень прост. Просто добавьте {} в const (A::a), как это:

echo $obj->{A::a};