重构 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?