2010-09-01 5 views
0
<?php 
    class test{ 
     function foo(){ 
      echo $this->abc; 
     } 
    } 
    $test = new test; 
    $test->abc = 'abc'; 
?> 

Помните, что я не объявляю переменную abc, но я хочу установить $ abc в 'abc'. Как это сделать К сожалению, потому что это фиктивный вопросКак сделать динамическую переменную

+4

Я не понимаю ваш вопрос. Вы уже устанавливаете '$ abc' в" abc ", не так ли? –

+0

Вы пытаетесь создать динамически названную переменную в классе 'test' с ** именем ** 'abc'? – Stephen

+3

Переменные всегда динамичны. В противном случае это будет постоянным. – JochenJung

ответ

0

На самом деле, это уже работает. Но это плохая практика.

Обычно вы должны сделать что-то вроде этого:

class test { 
    private $abc; 

    public function foo() { 
     echo $this->abc; 
    } 

    public function getABC() { 
     return $this->abc; 
    } 

    public function setABC($abc) { 
     // You can also add some additionally checks 
     $this->abc = $abc; 
    } 
} 

Что делает:

$bar = new test; 
$bar->setABC('abc'); 
$bar->foo(); 

Не забудьте сделать ваши атрибуты класса ($ а) всегда частный или защищенными. Это инкапсуляция, которая делает ООП настолько мощным.

Если вы хотите использовать динамические имена переменных, поэтому вместо $ this-> а вы хотите установить $ this-> сЬа вы должны использовать магические методы __set и __get

Подробнее о магических методах можно найти здесь:

http://php.net/manual/en/language.oop5.magic.php 
1
class test{ 
    public function __construct() { 
     $this->abc = 'abc'; 
    } 

    public function foo(){ 
     echo $this->abc; 
    } 
} 

$test = new test; 
$test->abc = 'abc'; 

$ а будут созданы в качестве публичной собственности теста класса, когда конструктор выполняются автоматически, когда вы экземпляр объекта

ИЛИ

class test{ 
     $this->abc = 'abc'; 

    public function foo(){ 
     if (!isset($this->abc)) 
     $this->abc = 'abc'; 

     echo $this->abc; 
    } 
} 

$test = new test; 
$test->abc = 'abc'; 

Создам общественную собственность под названием $ а в экземпляре класса теста при вызове метода Foo, если он уже не существует

+1

wow Я медленно. :( –

2

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

<?php 
    class Test { 
    public $abc; 
    public function __construct($abc) { 
     $this->abc = $abc; 
    } 

    public function __toString() { 
     return $this->abc; 
    } 
    } 

Затем вы можете позвонить классу и передать данные, которые вы хотите сделать так.

$myClass = new Test('abc'); 
echo $myClass; 

Конечно, вы должны эхо-сигнал, чтобы вызвать вызов магического метода __toString().

1

Вы проверили его? Это работает, хотя я не уверен, что это такая хорошая идея.

1

Вы можете «динамически создавать» свойства и функции, перегружая некоторые магические функции php. См. Ссылку this для получения дополнительной информации. Обычно для создания переменной при инициализации класса используется функция __construct (например, Mark Baker и MAINERROR). Это является предпочтительным способом.

Вы можете, однако, перезаписать (в вашем случае) функцию __set для обработки настроек недоступных свойств. Но имейте в виду, что перезапись и использование этих функций (кроме __construct) могут очень запутываться очень быстро.

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