PHP custom object casting
我在PHP中有一个名为product的自定义类对象:
1 2 3 4 5 6 7 8 9 | final class product { public $id; public $Name; public $ProductType; public $Category; public $Description; public $ProductCode; } |
将此类的对象传递给我的数据访问层时,我需要将传递的对象转换为产品类的类型,以便可以与该函数中的属性进行对话。 由于PHP中的类型转换仅适用于基本类型,因此,转换该传递的对象的最佳解决方案是什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | final class productDAL { public function GetItem($id) { $mySqlConnection = mysql_connect('localhost', 'username', 'password'); if (!$mySqlConnection) { trigger_error('Cannot connect to MySql Server!'); return; } mysql_select_db('databaseName'); $rs = mysql_query("SELECT * FROM tblproduct WHERE ID='$id';"); $returnObject = mysql_fetch_object($rs, 'product'); return $returnObject; } public function SaveItem($objectToSave, $newProduct = false) { $productObject = new product(); $productObject = $objectToSave; echo($objectToSave->Name); $objectToSave->ID; } } |
现在,我正在创建一个新的对象,将其转换为一种产品,然后将其设置为与传递给函数的对象相等。 有没有更好的方法来完成此任务? 我要走错路了吗?
针对清晰度进行了编辑-添加了完整程序类
您无需强制转换对象,就可以像使用产品一样使用它。
1 | $name = $objectToSave->Name; |
PHP中的类型转换是这样完成的:
1 | $converted = (type) $from; |
请注意,如果对象类型不兼容(例如$ form恰好是字符串或类型不匹配的对象),这将不起作用。
但是通常的解决方案(称为Active Record模式,例如在Zend Framework中存在)是为称为Row的数据库项提供基类。然后,单个项(例如,示例中的类
典型的ZF方案:
1 2 3 4 | $table = new Product_Table(); $product = $table->find($productId); // load the product with $productId from DB $product->someProperty = $newPropertyValue; $product->Save(); // UPDATE the database |
IMO比您的解决方案要好得多。
编辑:
您不能在两个不相关的对象之间进行转换,这是不可能的。
如果要像这样使用DAL,请跳过"产品"对象,然后使用简单的关联数组。您可以使用foreach枚举其成员,这与对象的属性不同(可以使用反射,但这太过分了)。
我的建议:选择Active Record模式(使用魔术方法很容易实现)。它将为您节省很多麻烦。
我不确定您要实现的目标,但是如果
-
您可以简单地调用
$objectToSave->SaveItem() (假设SaveItem() 是产品类的一部分)并在诸如$this->Name 之类的函数中访问其属性;等等。 -
在您的代码中,
$productObject 和$objectToSave 将保存对同一对象的引用。
当前,您正在创建一个新产品,然后立即将其丢弃(因为它的引用已由
1 2 3 4 |
(如果