2010-02-12 13 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可能?