关于类:PHP自定义对象的转换

 2020-01-16 

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的数据库项提供基类。然后,单个项(例如,示例中的类product)将从此类继承。

典型的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已经是一流产品:

  • 您可以简单地调用$objectToSave->SaveItem()(假设SaveItem()是产品类的一部分)并在诸如$this->Name之类的函数中访问其属性;等等。
  • 在您的代码中,$productObject$objectToSave将保存对同一对象的引用。

当前,您正在创建一个新产品,然后立即将其丢弃(因为它的引用已由$objectToSave代替。)很遗憾,您将需要一个一个地复制其属性。

1
2
3
4
foreach (get_object_vars($objectToSave) as $key => $value)
{
    $product->$key = $value;
}

(如果$objectToSave的属性是私有的,则需要公开一个调用get_object_vars($this)的方法to_array()。)