2010-02-12 6 views
2

Я уже несколько недель занимаюсь написанием PHP-класса, и мне нравится думать, что у меня есть ручка его основ, но я немного в тупике.Переменные класса PHP, опустошенные во время цикла

В упрощенном примере, что я делаю:

Я предрек и инстанцирован публичную переменную ($ myURL) в моем классе (SomeClass) и во внешнем файле (config.php) к классу заполнили переменную URL-адресом (http://demo.com).

В функции (make_array()) в пределах одного класса, я использую объявленную переменную ($ myURL) в цикле while() для создания ассоциативного массива данных, который я использую вне класса для создания указанного вывода (output.php).

Как только я установил переменную, используя функцию класса (set_myurl ($ url)) во внешнем файле (config.php), я могу легко получить доступ к ней за пределами файла класса, используя эхо, чтобы напечатать заданный URL на страницу.

Проблема возникает, когда я перебираю массив, и я хочу установить предопределенную переменную ($ myURL) для разных подматриц в ассоциативном массиве, который я создаю с помощью функции make_array() в моем классе файл. Функция make_array() принимает результат MSSQL $ и зацикливает строки, создающие массив, вставляющий URL-адрес, если он не существует, а для второго аргумента ($ add_my_url) установлено значение true.

Внутри функции определенная переменная становится пустой, но остается установленной, поскольку я протестировал ее со встроенными функциями PHP empty(), isset() и is_null(), чтобы устранить проблему.

Интересно, есть ли у кого-нибудь какие-либо знания или опыт, связанные с этим.

краткое представление о том, что я делаю

<?php 
class someClass { 
var $myURL = ''; 

public function set_myurl($url){ 
$this->myURL = $url; 
} 

public function make_array($db_result_array, $add_my_url = false){ 
$new_array = array(); 
while($row = $db_result_array){   
// build array 
$array = array(
'Amount' => $row['Amount'], 
'Description' => $row['Description'], 
'URL' => ($add_my_url ? (!$row['URL'] ? $this->myURL : $row['URL']) : $row['URL']) 
); 
// merge array 
$new_array[] = $array;   
}  

return $new_array; 
} 

} 
?> 

<?php 
// config.php 
$myClass = new someClass; 
$myClass->set_myurl('http://demo.com'); 

// this works and displays: http://demo.com 
echo $myClass->myURL; 
?> 

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

Если вам нужно уточнить, пожалуйста, спросите. Я вполне уверен, что я сузил проблему до этой функции и этого while() цикла.

Спасибо.

+1

Ваш пример работает так, как ожидалось для меня. – blinry

ответ

2

Я считаю, что что-то не так с вашим тройным условием, попробуйте следующее:

class someClass 
{ 
    public $myURL = ''; 

    public function set_myurl($url) 
    { 
     $this->myURL = $url; 
    } 

    public function make_array($db_result_array, $add_my_url = false) 
    { 
     $new_array = array(); 

     while ($row = $db_result_array) 
     { 
      // build array 
      $array = array 
      (
       'Amount' => $row['Amount'], 
       'Description' => $row['Description'], 
       //'URL' => ($add_my_url ? (!$row['URL'] ? $this->myURL : $row['URL']) : $row['URL']) 
      ); 

      if ($add_my_url === true) 
      { 
       $array['URL'] = $row['URL']; 

       if (empty($array['URL'])) 
       { 
        $array['URL'] = $this->myURL; 
       } 
      } 

      // merge array 
      $new_array[] = $array;   
     }  

     return $new_array; 
    } 
} 
+1

Думаю, у вас это есть. При настройке URL-адреса также нет необходимости использовать: 'URL' => ($ add_my_url && empty ($ row ['URL'])? $ This-> myURL: $ row ['URL']) – nortron

+0

Спасибо за первый ответ. Я не думаю, что проблема связана с тернарным состоянием, хотя, вероятно, это не самый оптимизированный метод для выполнения того, что я хотел сделать, как отметил @Cryo. Проблема в том, что переменная $ this-> myURL кажется пустой в функции, несмотря на то, что она правильно установлена. Это странная проблема, потому что она кажется такой простой. – paperclip

+0

@paperclip Если вы печатаете $ this-> myURL как самую первую строку метода make_array(), она все еще пуста?Если это не похоже на то, что код, который вы предоставили, содержит вашу проблему, myURL становится неуправляемым где-то еще (может быть, вызов set_myurl ('') где-то спрятан?). Я бы посоветовал постоянно упрощать свой код через свой класс, чтобы попытаться устранить проблему. – nortron

0

Может быть, проблема здесь while($row = $db_result_array){

Вы должны попробовать для/Еогеаспа может быть?