如何让工厂类在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类, DisplayStaff
和Employee
。
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?