2010-02-12 10 views
2

我一直在編寫一個PHP類幾個星期,現在我喜歡認爲我已經掌握了他的基礎知識,但我有點難住。在While循環中清空的PHP類變量

作爲一個簡單的例子我在做什麼:

我已經宣佈並在我的課(SomeClass的)實例化的公共變量($ myURL)和一個外部文件(config.php文件)到類用變量填充URL(http://demo.com)。

在同一個類中的函數(make_array())中,我在while()循環中使用聲明變量($ myURL)來構建數據的關聯數組,以便在類之外使用以構建列出的輸出(output.php)。

一旦我在外部文件(config.php)中使用類函數(set_myurl($ url))設置了變量,我可以通過使用echo打印設置的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 2010-02-12 11:14:54

回答

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 2010-02-12 11:15:05

+0

感謝您的第一個答覆。我認爲問題不在於三元條件,儘管@Cryo指出,這可能不是我想要做的最優化的方法。 問題是,$ this-> myURL變量似乎在函數內是空的,儘管看起來是正確設置的。 這是一個奇怪的問題,因爲它看起來很簡單。 – paperclip 2010-02-12 11:55:44

+0

@paperclip如果您打印出$ this-> myURL作爲make_array()方法的第一行,它仍然是空白的?如果是這樣,它看起來不像你提供的代碼包含你的問題,myURL在其他地方變得沒有設置(可能是對set_myurl('')的調用存儲在某個地方?)。我建議不斷地通過你的課程簡化你的代碼路徑,試圖清除問題方法。 – nortron 2010-02-12 12:02:10

0

也許問題就在這裏while($row = $db_result_array){

你應該嘗試爲/的foreach可能?