0

对 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 对象,以及几个私有函数。解决此问题的正确方法是什么,为什么我当前的方法不起作用?

4

3 回答 3

3

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

class processRoutes
{   
  //Next line works
  private $doc = "works as as string";

  private $doc;

  public function __construct()
  {
     $this->doc = new SimpleXMLElement('routingConfig.xml', null, true);
  }

  // ....
}
于 2012-10-09T14:46:27.563 回答
2

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

来自PHP 手册 - 属性

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

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

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

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

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

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

或者,您可能需要接受一些值才能正确设置您的类。当您调用时,这正是上面示例代码中发生的情况

private $doc = new SimpleXMLElement('routingConfig.xml', null, true);

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

于 2012-10-09T14:53:01.893 回答
0

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

public function getTablenames()
{
    $my_new_variable = $this->doc; // Transfers the $doc variable
}
于 2012-10-09T14:48:10.530 回答