如何让工厂类在PHP中创建对象实例?

我有一个包含许多成员条目的XML文件,格式如下:

<staff>
    <member>
        <name></name>
        <image></image>
        <title></title>
        <email></email>
        <phone></phone>
        <location></location>
        <info></info>
        <webTitle></webTitle>
        <webURL></webURL>
    </member>
</staff>

建立

我创建了2个PHP类, DisplayStaffEmployee

  • Employee创建一个Employee对象,其私有属性在上面的XML中概述。
  • DisplayStaff是一个工厂类。 它加载上面的XML文件,遍历它,为XML中的每个<member>元素创建一个Employee实例。 它将Employee对象存储在数组$Employees[]
  • 在我想输出员工信息的页面上,我希望能够像这样引用它。

    $Employees = new DisplayStaff();
    $John = Employees['John'];
    echo "Hello, my name is $John->name";
    

    <?php
     class DisplayStaff
     {
        private var $staffList;
        private var $placeholderImg;
        private var $Employees; 
    
        public function __construct() {
            $staffList      = simplexml_load_file("../data/staff.xml");
            $placeholderImg = $staffList->placeholderImg;
            foreach ( $staffList->member as $member ) {
                $employee = formatEmployeeObj( $member );
                array_push( $Employees, $employee );
            }
            return $Employees;
         }
    
         private function formatEmployeeObj( $memberXML ) {
             $Employee = new Employee();
    
             $Employee->set( $name,      $memberXML->name );
             $Employee->set( $image,     $memberXML->image );
             $Employee->set( $title,     $memberXML->title );
             $Employee->set( $email,     $memberXML->email );
             $Employee->set( $phone,     $memberXML->phone );
             $Employee->set( $location,  $memberXML->location );
             $Employee->set( $info,      $memberXML->info );
             $Employee->set( $webTitle,  $memberXML->webTitle );
             $Employee->set( $webURL,    $memberXML->webURL );
    
             return $Employee;
         }
    }
    ?>
    

    <?php
    class Employee
    {
    
         private var $name     = "";
         private var $image    = "";
         private var $title    = "";
         private var $email    = "";
         private var $phone    = "";
         private var $location = "";
         private var $info     = "";
         private var $webTitle = "";
         private var $webURL   = "";
    
            public function get($propertyName) {
            if( property_exists($this, $propertyName) ) {
                return $this->$propertyName;
            }
                else{
                    return null;
               }
        }
    
        public function set($propertyName, $propertyValue) {
            if( property_exists($this, $propertyName) ){
                $this->$propertyName = $propertyValue;
            }
        }
    }
    
    ?>
    

    问题

    我似乎无法得到这个工作。 我是新来的类工作。 我需要改变什么来让我的课程符合我的期望?

    感谢您提前寻求帮助。


  • 从每个类字段中删除var 。 这对于public是多余的,并且从PHP5开始也被弃用。 更多关于这一点

  • 构造函数不应该返回任何东西。 它会自动返回有问题的对象。 但请注意,由于它们都是私有的,并且没有访问器函数,因此无法访问任何DisplayStaff字段。 你可以像使用Employee一样使用通用访问器,但是有没有简单使用public字段的原因?

  • 每当你在类声明中引用一个对象的方法或属性时,你需要使用$this关键字,即

    public function __construct() {
      $this->staffList  = simplexml_load_file("staff.xml");
      $this->placeholderImg = $this->staffList->placeholderImg
      foreach ( $this->staffList->member as $member ) {
        $employee = $this->formatEmployeeObj( $member );
        array_push( $this->Employees, $employee );
      }
    //no need for a return
    }
    
  • 你的Employee属性访问器方法( Employee->get() )接受一个字符串作为第一个参数,即'name'$name是一个未定义的变量,因此它不起作用。

  • 您需要初始化您的Employees数组,然后才能推送到它。

    private $Employees = array();
    

  • 请注意,为了简洁起见,我省略了许多Employee属性和方法。

    class StaffFactory
    {
        public $employees = array();
    
        public function __construct($xml)
        {
            $xml = simplexml_load_file($xml);
            foreach ( $xml->member as $member ) {
                $this->employees[(string) $member->name] = new Employee((array) $member);
            }
        }
    
        public function getEmployee($name)
        {
            if ( isset($this->employees[$name]) ) {
                return $this->employees[$name];
            }
            return false;
        }
    
    }
    class Employee {
    
        public $email;
    
        public $name;
    
        public $title;
    
        public function __construct(array $employee)
        {
            foreach ( $employee as $k => $v ) {
                if ( property_exists($this, $k) ) {
                    $this->{$k} = $v;   
                }
            }
            return $this;
        }
    
    }
    $staffFactory = new StaffFactory('staff.xml');
    $john = $staffFactory->getEmployee('John');
    
    if ( $john ) {
        echo '<pre>';
        print_r($staffFactory);
        print_r($john);
        print_r($john->email);
        echo '</pre>';
    }
    
    链接地址: http://www.djcxy.com/p/96573.html

    上一篇: how to get Factory Class to create object instances in PHP?

    下一篇: Put PHP img src inside string