2013-11-15 150 views
0

我有很多成员条目,格式像这样的XML文件:如何让工厂类在PHP中创建对象实例?

<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中的每个​​元素创建一个Employee实例。它将Employee对象存储在数组中,$Employees[]

在我想输出Employee信息的页面上,我想能够像这样引用它。

$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; 
     } 
    } 
} 

?> 

问题

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

感谢您的高级帮助。

+0

DisplayStaff听起来像它应该有一个不同的名称。另外,它几乎不是工厂,因为它主要解析XML文件并将其内容转换为对象数组。关于你的问题:你有没有得到任何错误?如果没有,请尝试通过代码或转储变量来查看发生了什么? – GolezTrol

回答

1
  1. 取下每个类字段的var。这与public是多余的,并且从PHP5开始也被弃用。 More on this

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

  3. 任何你指的是类声明中对象的方法或属性的时候,你需要使用$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 
    } 
    
  4. 你的员工属性访问方法(Employee->get())需要字符串作为第一个参数,即'name'$name是一个未定义的变量,因此它不起作用。

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

    private $Employees = array(); 
    
0

请注意,为了简洁起见,我省略了许多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>'; 
} 
相关问题