【问题标题】:declaring variables in classes using PHP使用 PHP 在类中声明变量
【发布时间】:2012-09-29 22:26:36
【问题描述】:

对 PHP 中的类相当陌生,所以请耐心等待。

class processRoutes
    {   
        //Next line works
        private $doc = "works as as string";
        //Next line does not work, "Parse error: syntax error, unexpected T_NEW"
        private $doc = new SimpleXMLElement('routingConfig.xml', null, true);
        private function getTablenames()
        {
            //do stuff  
        }
    }

我试图最终在我的类中使用 SimpleXMLElement 对象,以及几个私有函数。解决此问题的正确方法是什么,为什么我当前的方法不起作用?

【问题讨论】:

    标签: php class simplexml private class-variables


    【解决方案1】:

    您需要在您的构造函数中执行此操作,因为在脚本解析的这个阶段无法对此进行评估。 '简单' 值,如字符串、布尔值和数值都可以。

    class processRoutes
    {   
      //Next line works
      private $doc = "works as as string";
    
      private $doc;
    
      public function __construct()
      {
         $this->doc = new SimpleXMLElement('routingConfig.xml', null, true);
      }
    
      // ....
    }
    

    【讨论】:

    • __construction() 函数只是用于执行此类各种任务的填充函数吗?似乎是不必要的额外步骤,但我确信这是有原因的......
    • 这是magically called,当类被实例化时。这一步没有不必要的步骤,在您的情况下这是强制性的。
    【解决方案2】:

    您正在尝试使用对象实例初始化属性,但您只能使用可以在“编译时”确定的常量来初始化变量。

    来自PHP Manual - Properties

    这个声明可能包含一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖运行时信息才能被评估。

    任何依赖于“运行时”知识的初始化都需要执行

    • $this->doc 上运行的构造函数中(请参阅@Dan-Lee 关于如何实现的答案),
    • 例如从您的构造函数调用的“初始化程序”函数(您可能会这样做以使“初始化”步骤与您的构造函数可能完成的其他“实际工作”不同),或
    • 由您班级的消费者手动操作。消费者可以操作
      • 直接在属性或您的对象上(例如myProcessRoutes->doc = 'some other string'),
      • 通过函数调用您的对象,例如myProcessRoutes.initialise_doc('some other string'),或
      • 通过对象上的设置器 - 我会让你研究这些,因为我没有在 PHP 中使用过这些! ;-)

    (尽管如果这些在实例化/构造函数之后发生的方法真的是初始化,这是有争议的/哲学的)。

    类构造函数/析构函数的要点是提供一个“钩子”,通过它可以根据需要初始化/释放对象实例。

    您可能只需要根据您的示例创建一些特定的新实例,在这种情况下,您不需要接受来自使用者的构造函数的任何输入。

    或者,您可能需要接受一些值才能正确设置您的类。当您调用

    时,这正是上面示例代码中发生的情况
    private $doc = new SimpleXMLElement('routingConfig.xml', null, true);
    

    (也就是说,您将'routingConfig.xml'nulltrue 的值传递给SimpleXMLElement 的新实例,以便此实例的构造函数可以使用您传递给的值初始化实例它,可以使用了)。

    【讨论】:

      【解决方案3】:

      任何时候你想引用一个类的变量,使用关键字$this

      public function getTablenames()
      {
          $my_new_variable = $this->doc; // Transfers the $doc variable
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多