“严格标准:只应通过引用传递变量”错误

时间:2012-03-24 01:13:42

标签: php

我正在尝试根据代码获取基于HTML的递归目录列表:

http://webdevel.blogspot.in/2008/06/recursive-directory-listing-php.html

代码运行正常,但它会引发一些错误:

  

严格标准:只应通过引用传递变量   第34行的C:\ xampp \ htdocs \ directory5.php

     

严格标准:只应通过引用传递变量   第32行的C:\ xampp \ htdocs \ directory5.php

     

严格标准:只应通过引用传递变量   第34行的C:\ xampp \ htdocs \ directory5.php

以下是代码摘录:

else
  {
   // the extension is after the last "."
   $extension = strtolower(array_pop(explode(".", $value)));   //Line 32

   // the file name is before the last "."
   $fileName = array_shift(explode(".", $value));  //Line 34

   // continue to next item if not one of the desired file types
   if(!in_array("*", $fileTypes) && !in_array($extension, $fileTypes)) continue;

   // add the list item
   $results[] = "<li class=\"file $extension\"><a href=\"".str_replace("\\", "/",     $directory)."/$value\">".$displayName($fileName, $extension)."</a></li>\n";
  }

4 个答案:

答案 0 :(得分:56)

这应该没问题

   $value = explode(".", $value);
   $extension = strtolower(array_pop($value));   //Line 32
   // the file name is before the last "."
   $fileName = array_shift($value);  //Line 34

答案 1 :(得分:24)

array_shift唯一的参数是通过引用传递的数组。 explode(".", $value)的返回值没有任何引用。因此错误。

您应该首先将返回值存储到变量中。

    $arr = explode(".", $value);
    $extension = strtolower(array_pop($arr));   
    $fileName = array_shift($arr);

来自PHP.net

  

以下内容可以通过引用传递:

- Variables, i.e. foo($a)
- New statements, i.e. foo(new foobar())
- [References returned from functions][2]
  

不应该通过引用传递其他表达式,因为结果是未定义的。例如,以下通过引用传递的示例无效:

答案 2 :(得分:3)

我遇到了类似的问题。

我认为问题在于,当您尝试包含两个或多个处理数组类型变量的函数时,php将返回错误。

比如说这个。

$data = array('key1' => 'Robert', 'key2' => 'Pedro', 'key3' => 'Jose');

// This function returns the last key of an array (in this case it's $data)
$lastKey = array_pop(array_keys($data));

// Output is "key3" which is the last array.
// But php will return “Strict Standards: Only variables should 
// be passed by reference” error.
// So, In order to solve this one... is that you try to cut 
// down the process one by one like this.

$data1  = array_keys($data);
$lastkey = array_pop($data1);

echo $lastkey;

你去吧!

答案 3 :(得分:2)

不是手动解析它,而是最好使用pathinfo函数:

$path_parts = pathinfo($value);
$extension = strtolower($path_parts['extension']);
$fileName = $path_parts['filename'];