1

如果我有一堂课:

class ExampleClass {
    private $thing1;
    private $thing2;
}

我可以fetch_object('ExampleClass')在 mysqli_result 对象上使用来创建 ExampleClass 的实例。使用此方法,将设置 ExampleClass 的私有属性,前提是查询具有相同名称的列。

除了这些属性之外,还将为查询中的任何其他列添加其他公共属性。有没有办法避免这种情况?我在fetch_object的 php 文档中找不到任何关于它的信息。

如果我使用这样的构造函数设置 ExampleClass

function __construct($properties = []) {
    foreach ($properties as $key => $value)
        if (property_exists($this, $key))
            $this->$key = $value;
}

我可以使用 fetch_assoc 而不是 fetch_object 从结果集中获取行,然后使用结果数组作为参数创建一个新的 ExampleClass。这实现了我的目标,但我希望得到更直接的东西。

4

1 回答 1

0

对于我的一个项目,我已经建立了一个这样的系统。所有类都派生自基本抽象 Object 类,除其他外,它提供了一种cloneInstance()方法。然后,在具体的实现类中,我将简单地使用它('为了简洁,我假设 $pdo 可以在这里以某种方式访问​​):

请注意,cloneInstance()使用反射来检查目标实例是否实际上具有同名属性 ( $drfl->hasProperty())。

abstract class Object {

    protected function cloneInstance($obj) {
        if (is_object($obj)) {
            $srfl = new ReflectionObject($obj);
            $drfl = new ReflectionObject($this);
            $sprops = $srfl->getProperties();
            foreach ($sprops as $sprop) {
                $sprop->setAccessible(true);
                $name = $sprop->getName();
                if ($drfl->hasProperty($name)) {
                    $value = $sprop->getValue($obj);
                    $propDest = $drfl->getProperty($name);
                    $propDest->setAccessible(true);
                    $propDest->setValue($this,$value);
                }
            }
        }
        return $this;
    }


class MyAutomaticClass extends Object {
    // static loader
    public static function load($id) {
        $result = null;
        $sql = 'SELECT * FROM mytable WHERE id=:id';
        $stmt = $pdo->prepare($sql, array(':id' => $id));
        $list = $stmt->fetchAll(PDO::FETCH_OBJ);
        if (count($list)) {
            $result = new MyAutomaticClass($list[0]);
        }
        return $result;
    }

    // constructor makes use of base Objects cloning feature
    public function __construct($obj=null) {
        if (is_object($obj)) {
            $this->cloneInstance($obj);
        }
    }
}
于 2013-10-16T21:21:43.493 回答