Вызов определенной константы из переменной-переменной - PullRequest
1 голос
/ 15 декабря 2011

Я пытаюсь сослаться на определенную константу в отдельной функции.Ошибки, которые я получаю, относятся к не определенной переменной и переменной, определенной как константа для каждого FOO и BAR.

class Boo {
public function runScare() {
    $this->nowScaring('FOO');
    $this->nowScaring('BAR');
}
private function nowScaring($personRequest) {
    define ('FOO', "test foo");
    define ('BAR', "test bar");
    $person = ${$personRequest};
    echo "<br/>Query selected is: " . $person . "<br/>";
}
}
$scare = new Boo;
$scare->runScare();

Ответы [ 3 ]

7 голосов
/ 15 декабря 2011

Константы должны быть определены только один раз, вверху вашего скрипта, например:

define ('FOO', "test foo"); 
define ('BAR', "test bar"); 

Тогда, чтобы получить к ним доступ, не ставьте их имена в кавычках:

class Boo { 
  public function runScare() { 
      $this->nowScaring(FOO); // no quotes
      $this->nowScaring(BAR); // no quotes
  } 
  private function nowScaring($person) {
      // And no need to "grab their values" -- this has already happened
      echo "<br/>Query selected is: " . $person . "<br/>"; 
  } 
} 

Если по какой-то причине вы хотите получить значение константы и все, что у вас есть, это ее имя в переменной, вы можете сделать это с помощью функции constant:

define ('FOO', "test foo"); 

$name = 'FOO';
$value = constant($name);

// You would get the same effect with
// $value = FOO;

В данном конкретном случае выглядит так, что константы класса могут быть более подходящими:

class Boo { 
  const FOO = "test foo";
  const BAR = "test bar";


  public function runScare() { 
      $this->nowScaring(self::FOO); // change of syntax
      $this->nowScaring(self::BAR); // no quotes
  } 
  private function nowScaring($person) {
      echo "<br/>Query selected is: " . $person . "<br/>"; 
  } 
} 
0 голосов
/ 15 декабря 2011
class Boo {
public function runScare() {
    $this->nowScaring('FOO');
    $this->nowScaring('BAR');
}
private function nowScaring($personRequest) {
    if( !defined('FOO') ){
        define ('FOO', "test foo");
    }
    if( !defined('BAR') ){
        define ('BAR', "test bar");
    }
    $person = constant($personRequest);
    echo "<br/>Query selected is: " . $person . "<br/>";
}
}
$scare = new Boo;
$scare->runScare();

Но я не думаю, что было бы хорошей идеей определять константы в методе некоторого класса. И, конечно же, в большинстве случаев вам не нужно извлекать их значения по переменной.

0 голосов
/ 15 декабря 2011

Вы можете определить константы только один раз , и они будут определены глобально.

...