【问题标题】:PHP - strange syntax errors with brackets inside Class arrayPHP - 类数组中带有括号的奇怪语法错误
【发布时间】:2013-11-02 08:00:01
【问题描述】:

我有一个像这样的简单代码:

        class o99_custom_fields {
            /**
            * @var  string  $prefix  The prefix for storing custom fields in the postmeta table
            */
            var $prefix = 'o99_';
            /**
            * @var  array  $customFields  Defines the custom fields available
            */
            var $customFields = array(

                array(
                    "name"          => "some_name",
                    "title"         => "some Title",
                    "description"   => "Some Desctiption Text",
                    "type"          => "k_upload",
                    "scope"         =>  array( "post" ),
                    "capability"    => "edit_post"
                ),

                array(
                    "name"          => "some_name2",
                    "title"         => "some Title",
                    "description"   => "Some Desctiption Text",
                    "type"          => "k_upload",
                    "scope"         =>  array( "post" ),
                    "capability"    => "edit_post"
                ),

                array(
                    "name"          => "some_name3",
                    "title"         => "some Title",
                    "description"   => "",
                    "type"          => "k_textarea",
                    "scope"         =>  array( "post" ),
                    "capability"    => "edit_post"
                ),
            );
... more functions and more code ...
    } // End Class

一切似乎都很好,

当我尝试更改一些数组值并将它们放在括号内时问题开始()

例如:

array(
                "name"          => "some_name",
                "title"         => __("some Title","text_domain"),// ERROR OCCUR
                "description"   => "Some Desctiption Text",
                "type"          => "k_upload",
                "scope"         =>  array( "post" ),
                "capability"    => "edit_post"
            ),

错误信息是:

Parse error: syntax error, unexpected '(', expecting ')' in E:\my_path\myfile.php on line 18

请注意,它与函数__()standard wordpress translation function)无关,错误与函数无关,而是SYNTAX。 (我过去使用过这个函数数百次,没有任何问题 - 在这种情况下,_x()_e() 也因相同的语法错误而失败..)

我所有的括号都是封闭的,我已经检查了又重新检查了,除非我完全失明,否则我会说没关系,但我仍然会收到这个错误,无论我把括号放在这个类的什么位置。

另一个例子:这也会失败并出现同样的错误:

class o99_custom_fields {
                /**
                * @var  string  $prefix  The prefix for storing custom fields in the postmeta table
                */
                var $prefix = 'o99_';
                /**
                * @var  array  $customFields  Defines the custom fields available
                */
                var $dummy_strings = array (
__('x1','text_domain'),
__('x2','text_domain'),
);

    ... more functions and more code ...
        } // End Class

同样,错误似乎与 SYNTAX 相关,即使我所有的括号都已关闭。 我还检查了文件中正确的 php 开始和结束标记,甚至字符集和编码(没有 BOM 的 UTF-8)

我以前从未遇到过这样的问题 - 所以任何帮助/提示/见解将不胜感激..

编辑我:

在这些数组之后,是构造函数..

/**
* PHP 4 Compatible Constructor
*/
function o99_custom_fields() { $this->__construct(); }
/**
* PHP 5 Constructor
*/

function __construct() {
    add_action( 'admin_menu', array( &$this, 'createCustomFields' ) );
    add_action( 'save_post', array( &$this, 'saveCustomFields' ) );
}

【问题讨论】:

  • 嗯,你完全正确,这很奇怪:/

标签: php arrays syntax brackets


【解决方案1】:

您遇到的问题是因为您无法通过调用其他函数来初始化类属性。

将属性初始化为默认值,如下所示:

class SomeClass{
...
private $myProp0 = array(); //OK
private $myProp1 = array('foo' => 'bar', 'foooo' => 'baaar'); //OK
private $myProp2 = null; //OK
private $myProp3 = 10; //OK
private $myProp4 = "something"; //OK
private $myProp5 = __('translate me') // NOT OK
...
}

要使用其他值初始化您的属性(例如,通过调用其他函数),您必须在类的构造函数中设置它。

这样的事情应该可以工作:

function someFunction($x, $y){
    return "mouahahaha";
}

class SomeClass{
    private $something = array();

    public function __construct(){
        $this->something = array(
            'somekey1' => 'foobar',
            'somekey2' => someFunction("foo", "bar"),
        );
    }
}

换句话说,您需要将数组初始化从类主体移动到构造函数。

把这个例子放到你自己的代码中:

class o99_custom_fields {
        /**
        * @var  string  $prefix  The prefix for storing custom fields in the postmeta table
        */
        var $prefix = 'o99_';
        /**
        * @var  array  $customFields  Defines the custom fields available
        */
         private $customFields = array();
        /**
        * PHP 4 Compatible Constructor
        */
        function o99_custom_fields() { $this->__construct(); }
        /**
        * PHP 5 Constructor
        */

        public function __construct() {

         $this->customFields =  array(

            array(
            "name"          => "some_name",
            "title"         => __("some Title","text_domain"),// NO ERROR NOW
            "description"   => "Some Desctiption Text",
            "type"          => "k_upload",
            "scope"         =>  array( "post" ),
            "capability"    => "edit_post"
        ),
       );
       // Do your other construct things 
     } // END __construct

【讨论】:

  • 见 Damien Pirsy 的评论。函数__() 已声明且可用。而且 - 我得到的只是一个语法错误(我也没有从你的例子中看到我该如何解决它,即使我认为你的方向是正确的。只是将 public 添加到我的构造没有帮助并且错误仍然存​​在)
  • 问题是你不能使用不是常量或“常量值”的值来初始化类属性——也就是说,它必须能够在编译时被评估并且不能依赖运行时信息来进行评估”
  • 那该怎么做呢? (请记住,我已经退出了类和 PHP 的新手..)我还尝试了这里描述的方法:stackoverflow.com/questions/4018413/…(匿名函数和回调)
  • 看看我更新的答案。您需要将数组初始化从类主体移动到构造函数。
  • 您的最后一句话是我正在寻找的解释。它现在确实有效并且问题解决了..问题是我缺乏 PHP 的 OOP 知识.. 但是用跛脚男人的术语(或者在这种情况下是女孩的)解释确实有帮助 :-) 直到那个评论,我真的没有了解应该采取哪些实际步骤。给出了问题的解释,但没有给出解决方案..
【解决方案2】:

我现在注意到有问题的数组是一个类属性;错误在这里并没有真正的帮助,但请阅读 class properties 上的手册:

[...]这个声明可能包括一个初始化,但是这个 初始化必须是一个常量值——也就是说,它必须能够 在编译时进行评估,并且不能依赖于运行时 信息以便进行评估。

即 __() 函数属于这种情况。其实如果是普通的数组定义,是不会投错的,看这个ideone

function __($param1,$param2){}

$customFields = array(
   array(
     "name" => "some_name",
      "title" => __("some Title","text_domain"),// ERROR OCCUR
      "description" => "Some Desctiption Text",
      "type" => "k_upload",
      "scope" => array( "post" ),
      "capability" => "edit_post"
    ),
);

使用构造函数初始化属性;此外,关键字var 应替换为显式可见性关键字(此处为public

【讨论】:

  • 确实我怀疑这与它是一个类的事实有关 - 但我仍然不明白。 1 - __() 函数已经声明并且可用 2. - 我在类(参见 EDIT I)和 3 中有构造。为什么会出现语法错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多