重构 PHP OOP - 如何在不传递参数的情况下获取对象?

Posted

技术标签:

【中文标题】重构 PHP OOP - 如何在不传递参数的情况下获取对象?【英文标题】:Refactoring PHP OOP - How to get the object without passing a parameter? 【发布时间】:2011-02-15 11:19:36 【问题描述】:

我需要重构这段代码,在使用“save()”方法时不使用参数。

代码是:

Person.php

class Person 

    public $name;
    public $age;
    public $country;

    public function save($object) 

        $api = new ReflectionClass($object);

        foreach($api->getProperties() as $propertie)
        
            print $propertie->getName() . " - " . $propertie->getValue($object) . " | ";    
               
    



?>

Example_usage.php

include_once('person.php');

$p = new Person();

$p->name = 'Mary';
$p->age = '28';
$p->country = 'Italy';
$p->save($p);

?>

我的问题。我怎样才能像这样使用“save()”方法:

$p->save();

除了在“save()”方法中传递参数之外,是否可以通过其他方式传递$p对象?

【问题讨论】:

【参考方案1】:

当前对象可通过$this 关键字获得,您无需传递对象,只需在类方法中使用$this 在您的情况下指向该对象$p

修改后的方法如下所示

public function save() 

        $api = new ReflectionClass($this);

        foreach($api->getProperties() as $propertie)
        
            print $propertie->getName() . " - " . $propertie->getValue($this) . " | ";    
               
    

【讨论】:

感谢您的回复。这实际上会做我想做的事。最好的问候,【参考方案2】:

您不应为此使用 ReflectionClass

public function save() 
    echo $this->name; //etc
    // or maybe

    $name = mysql_real_escape_string($this->name);
    $age = ...
    $country = ... 

    mysql_query("INSERT INTO persons (name, age, country) values ('$name', '$age', '$country')");

如果您想获取每个变量的名称及其值,很简单:

class test 
        public $key = 2;
        public $star = 'sun';
        private $planet = 'earth';

        public function save() 
                foreach($this as $key => $value) 
                         echo "$key => $value".PHP_EOL;
                
        



$t = new test();
$t->save();

【讨论】:

1.示例不存储在数据库中。 2. 准备好的陈述。学习它们。 3. PDO。 @Cthulhu: 1. “或者也许” -> 我试图帮助扩大解决方案的范围,因为名为 save() 的方法可能意味着“使持久化”,其中数据库位于恰当的。对? 2. 这有点超出了这个问题的范围,你不觉得吗?我使用了那条转义机制以防作者将建议放入实时应用程序中。至少它会有点保护。 3. 我更喜欢 Zend_Db 和 Doctrine,试试看,你会喜欢的。 @Cthulhu:你觉得ReflectionClass在问题中的使用怎么样? 原文 嗨,我将使用 save() 将信息存储到数据库中。我正在尝试 ReflectionClass,因为数据库模型不是很常见 @André:我的第一个例子呢?它包含如何获取类的变量及其用于手动插入的键,如果您希望所有属性代表数据库表的一行,请将其与第二个示例结合使用。你可能应该用谷歌搜索Active Record (en.wikipedia.org/wiki/Active_record)【参考方案3】:

您是否总是希望将调用保存方法的Person 类的实例传递给ReflectionClass? 然后你也可以只传递$this,它总是引用类的实例。

【讨论】:

666:您能否发布一个案例,说明何时可以将$this 传递给同一类的实例?为什么应该首选它而不是仅在当前实例中使用$this 我的意思是,就像 Shakti Singh 回答的那样(也许解释得更好一些)。在 Person 类中,他应该只传递 $this 而不是将 Person 类的实例从外部传递给 save 方法。

以上是关于重构 PHP OOP - 如何在不传递参数的情况下获取对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不连接 Powershell 的情况下传递参数? [复制]

如何在不传递预期参数但使用它已有的参数的情况下调用 sub?

在不需要 URL 参数的情况下将 props 传递给路由

如何在不复制太多代码的情况下重构此代码?

如果所需的密钥不存在,如何在不中断的情况下传递 link_to 中的参数?

java Web工程,如何在不传参数的情况下,判断WebService接口是不是开放