Инициализировать статический массив для использования его в другой статической переменной другого класса - PullRequest
0 голосов
/ 18 августа 2011
class Assignation {
  private $VVal_1 = 1;
  private $VNam_1 = "One";
  //....Multiple Items
  private $VVal_2000 = 2000; //For Example
  private $VNam_2000 = "Two Thousands"; //For Example
  private static $Hash = array(); //How to initialize???

  private static function Assigning(){
  //This function for to assign the array elements (initialize)
    global $Hash;
    $this->Hash = array(); //to empty Hash variable and not add more data than it should.
    $this->Hash[$this->VVal_1] = $this->VNam_1;
    //....Multiple Items
    $this->Hash[$this->VVal_2000] = $this->VNam_2000;
  }

  public static function GetVal($Nam) {
    $this->Assigning();  //or use self::Assigning(); //I want to avoid this call
    if (array_search($Nam, $this->Hash))
      return array_search($Nam, $this->Hash);
    return -1;//error
  }

  public static function GetNam($Val) {
    $this->Assigning();  //or use self::Assigning(); //I want to avoid this call
    if (array_key_exists($Val, $this->Hash))
      return $this->Hash[$Val];
    return "Error";
  }
}

Class Testing {
  static $OtherVal = Assignation::GetVal("BLABLA"); //for example
  static $OtherNam = Assignation::GetNam(20); //for example
  //Other functions...
}

Привет, вы можете увидеть мой скрипт или код php ... Мне нужно инициализировать массив Hash , здесь есть слово static , потому что мне нужно использовать его вдругая статическая функция.И эту «другую функцию» нужно использовать для другой статической переменной ... Мне нужно знать, как правильно ее реализовать ..

Спасибо, чеп .-.


<?php
echo "pre-Class Assignation<br/>";
class Assignation {
  private $VVal_1 = 1;
  private $VNam_1 = "One";
  private $VVal_2K = 2000;
  private $VNam_2K = "Two Thousands";
  private static $Hash = array();

  private static function Assigning(){
    if(!empty(self::$Hash)) return;
    self::$Hash[$this->VVal_1] = $this->VNam_1;
    self::$Hash[$this->VVal_2K] = $this->VNam_2K;
  }

  public static function GetVal($Nam) {
    self::Assigning();
    if (array_search($Nam, self::$Hash)) return array_search($Nam, self::$Hash);
    return -1;//error
  }

  public static function GetNam($Val) {
    self::Assigning();
    if (array_key_exists($Val, self::$Hash)) return self::$Hash[$Val];
    return "Error";
  }
}
echo "post-Class Testing<br/>";
echo Assignation::GetVal("BLABLA");
echo "post-Class Mid<br/>";
echo Assignation::GetNam(20);
echo "post-Class Sample<br/>";
//Testing::MyPrint();
?>

Этот код не работает, кто-нибудь, помогите мне протестировать код ... результат:

pre-Class Assignation
post-Class Assignation
post-Class Testing

, что означает: "echo Assignation :: GetVal (" BLABLA ");"есть ошибка ...

1 Ответ

1 голос
/ 18 августа 2011

В Assigning() попробуйте использовать self::$Hash вместо $this->Hash и удалите global $Hash. То же самое относится и к звонкам Assigning(): self::Assigning(), как подсказывают ваши комментарии.

$this ссылается на текущий объект, поэтому вы должны использовать self:: для всех статических функций и данных-членов внутри класса.

Кроме того, если это ваш реальный код, а не просто пример, вы можете проверить, выполнили ли вы инициализацию, в противном случае вы будете делать это для каждого вызова GetVal() и GetNam(). Вы можете сделать это, добавив что-то вроде if(!empty(self::$Hash)) return в начале Assigning()

EDIT

private static function Assigning() {
    if(!empty(self::$Hash)) return; // already populated
    self::$Hash = array();
    self::$Hash[$this->VVal_1] = $this->VNam_1;
    //....Multiple Items
    self::$Hash[$this->VVal_2K] = $this->VNam_2K;
}
...