【问题标题】:Notice: Undefined variable: arr in /opt/lampp/htdocs/IRIS/controllers/get_category.php on line 9注意:未定义变量:第 9 行 /opt/lampp/htdocs/IRIS/controllers/get_category.php 中的 arr
【发布时间】:2017-08-10 19:51:35
【问题描述】:

我试图从另一个类访问静态变量,但我不断收到一个错误(标题中的那个),说我的变量没有被识别。

下面是我的 Categorize 类,其中的静态变量是一个名为 $arr 的数组:

     class Categorize extends Controller{
       public static $arr = array();
       function run($xml){
              global $FILE_ROOT, $STORAGE, $REQ_ID, $CMD_EXTRA, $LIB,
 $BIN;

              $numCategories = intval($xml->numCategories);
              self::$arr;
              /*self::$arr = array();*/

              /*if(!pe($xml, "resourceList")) die(err("No resources found"));*/

              for($i=0;$i < $numCategories; $i++){
                  $name = intval($xml->nameCat);
                         if($i=0){
                            $arr[0][0] = $name;
                         }else{
                            $arr[$i][0] = $name;
                         }

              }
              $j = 0;
              while($j < $numCategories){
                  $numDoc = intval($xml->numDoc);
                       $k = 0;
                       foreach($xml->resourceList->resource as $res){
                                  $arr[$j][$k] = $res;
                                  $k++;
                       }
                   $j++;         
              }
             $output = "Done!";
             $response = "<parameters><requestType>categorize</requestType><requestID>". $REQ_ID . "</requestID><resourceList>". $output . "</resourceList></parameters>";

             return $response;
       }
 }

这是一个名为 Get_category 的类,我试图从我的 Categorize 类中访问静态变量 $arr:

     class Get_category extends Controller{
            function run($xml){
            global $FILE_ROOT, $STORAGE, $REQ_ID, $CMD_EXTRA, $LIB, 
            $BIN;
            include_once __DIR__.'/categorize.php';
            $file = $xml->filename;
            Categorize::$arr;
            /*$arrlength = count($arr);*/
            $arrlength = max(array_map('count', $arr));
            $response = "<parameters>\n<requestID>" . $REQ_ID ."</requestID>\n<requestType>get_category</requestType>";

            for($i = 0; $i < $arrlength; $i++){
            $lengthcolumn = count($arr[$i]);
            for($j = 0; $j < $lengthcolumn; $j++){
                if($arr[$i][$j] == $file){
                echo $arr[$i][$j];
                $response .= "<resource><id>" . $arr[$i][$j] . "</id>";
        $response .= "</resource>";
                }

            }

         }

        $response .= "</parameters>";

        return $response; 

         }

}

我不明白为什么我的 $arr 变量无法识别。

【问题讨论】:

标签: php arrays variables static undefined-variable


【解决方案1】:

您好像忘记分配$arr = Categorize::$arr;

Categorize::$arr;
/*$arrlength = count($arr);*/
$arrlength = max(array_map('count', $arr));

【讨论】:

    【解决方案2】:

    在 PHP 中,您不能使用常规变量语法访问类属性。静态属性使用self::$property访问,对象属性使用$this-&gt;property访问。

    所以你有$arr 的地方应该是self::$arr。您发布的两个函数都需要此更改。它不会在第一个函数中导​​致错误,因为它是分配给变量而不是读取它,因此它也创建了变量。但我假设其意图是填写 public static $arr 属性,但由于访问不正确而没有发生。

    class Categorize extends Controller{
    
        public static $arr = array();
    
        function run($xml){
            global $FILE_ROOT, $STORAGE, $REQ_ID, $CMD_EXTRA, $LIB,
                $BIN;
    
            $numCategories = intval($xml->numCategories);
            self::$arr;
            /*self::$arr = array();*/
    
            /*if(!pe($xml, "resourceList")) die(err("No resources found"));*/
    
            for($i=0;$i < $numCategories; $i++){
                $name = intval($xml->nameCat);
                if($i=0){
                    self::$arr[0][0] = $name;
                }else{
                    self::$arr[$i][0] = $name;
                }
    
            }
            $j = 0;
            while($j < $numCategories){
                $numDoc = intval($xml->numDoc);
                $k = 0;
                foreach($xml->resourceList->resource as $res){
                    self::$arr[$j][$k] = $res;
                    $k++;
                }
                $j++;         
            }
            $output = "Done!";
            $response = "<parameters><requestType>categorize</requestType><requestID>". $REQ_ID . "</requestID><resourceList>". $output . "</resourceList></parameters>";
    
            return $response;
        }
    }
    
    class Get_category extends Controller{
        function run($xml){
            global $FILE_ROOT, $STORAGE, $REQ_ID, $CMD_EXTRA, $LIB, 
                $BIN;
            include_once __DIR__.'/categorize.php';
            $file = $xml->filename;
            /*self:$arrlength = count(self:$arr);*/
            $arrlength = max(array_map('count', self::$arr));
            $response = "<parameters>\n<requestID>" . $REQ_ID ."</requestID>\n<requestType>get_category</requestType>";
    
            for($i = 0; $i < self::$arrlength; $i++){
                $lengthcolumn = count(self::$arr[$i]);
                for($j = 0; $j < $lengthcolumn; $j++){
                    if(self::$arr[$i][$j] == $file){
                        echo self::$arr[$i][$j];
                        $response .= "<resource><id>" . self::$arr[$i][$j] . "</id>";
                        $response .= "</resource>";
                    }
    
                }
    
            }
    
            $response .= "</parameters>";
    
            return $response; 
    
        }
    
    }
    

    这是 PHP 与其他一些 OOP 语言(如 C++ 和 Java)之间的显着差异。请参阅Could not retrieve a property of class in PHP 了解我对此原理的解释。

    【讨论】:

    • 我应该把 self:$arr 放在第二类的哪里?
    • 您目前拥有$arr的每个地方。
    • 知道了,错误已经消除!但现在我得到一个不同的错误:致命错误:未捕获的错误:访问未声明的静态属性:Get_category::$arr in /opt/lampp/htdocs/IRIS/controllers/get_category.php:9
    • 有一些拼写错误和编辑问题,请尝试再次复制Get_category
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2020-07-18
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多