我记得您将使用域模型类来完全隐藏这样一个事实:您正在使用数据库表进行持久化。所以传递一个表对象或行对象应该完全在下面:
<?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
$db = Zend_Db::factory('mysqli', array('dbname'=>'test',
'username'=>'root', 'password'=>'xxxx'));
Zend_Db_Table_Abstract::setDefaultAdapter($db);
class Table_Person extends Zend_Db_Table_Abstract
{
protected $_name = 'person';
}
class Model_Person
{
/** @var Zend_Db_Table */
protected static $table = null;
/** @var Zend_Db_Table_Row */
protected $person;
public static function init() {
if (self::$table == null) {
self::$table = new Table_Person();
}
}
protected static function factory(Zend_Db_Table_Row $personRow) {
$personClass = 'Model_Person_' . ucfirst($personRow->person_type);
return new $personClass($personRow);
}
public static function get($id) {
self::init();
$personRow = self::$table->find($id)->current();
return self::factory($personRow);
}
public static function getCollection() {
self::init();
$personRowset = self::$table->fetchAll();
$personArray = array();
foreach ($personRowset as $person) {
$personArray[] = self::factory($person);
}
return $personArray;
}
// protected constructor can only be called from this class, e.g. factory()
protected function __construct(Zend_Db_Table_Row $personRow) {
$this->person = $personRow;
}
public function login($password) {
if ($this->person->password_hash ==
hash('sha256', $this->person->password_salt . $password)) {
return true;
} else {
return false;
}
}
public function setPassword($newPassword) {
$this->person->password_hash = hash('sha256',
$this->person->password_salt . $newPassword);
$this->person->save();
}
}
class Model_Person_Admin extends Model_Person { }
class Model_Person_Associate extends Model_Person { }
$person = Model_Person::get(1);
print "Got object of type ".get_class($person)."\n";
$person->setPassword('potrzebie');
$people = Model_Person::getCollection();
print "Got ".count($people)." people objects:\n";
foreach ($people as $i => $person) {
print "\t$i: ".get_class($person)."\n";
}
“我认为静态方法不好
这就是为什么我要创造
表级方法作为实例
方法。
我不接受任何笼统的说法
static
总是坏的,或者单身总是坏的,或者
goto
总是坏的,或者你有什么。做出如此明确声明的人正试图将问题过于简单化。适当地使用语言工具,它们会对您有好处。
也就是说,当您选择一种语言结构时,通常会有一种权衡,这使得做一些事情更容易,而做其他事情更难。人们常常指向
静止的
这使得编写单元测试代码变得困难,而且PHP还存在一些与静态和子类化相关的令人恼火的缺陷。但是也有一些好处,正如我们在这段代码中看到的。你必须根据具体情况来判断利弊。
“Zend框架是否支持查找工具?
上课?”
我不认为这是必要的。
“你有什么特别的理由
已重命名要获取的find方法
模型类?”
我给这个方法命名了
get()
只是为了区别于
find()
. “getter”范式与OO接口相关,而“finder”传统上与数据库相关。我们试图设计域模型来假装不涉及数据库。
“您是否可以继续使用
实现特定getby的相同逻辑
和getcollection by methods?“
我会抵制创建一个通用的
getBy()
方法,因为它很容易让它接受通用的SQL表达式,然后将其逐字传递给数据访问对象。这将域模型的使用与底层数据库表示相结合。