PHP 让函数设置一个成员变量或让它 return 结果
PHP Let function set a member variable OR let it return the result
我一直在想一些事情,我希望有人能为我澄清。
假设我们有一个 class
class Test
{
private $value;
function first()
{
if("this"=="that") {
$neededVariable = 1;
}
}
function second()
{
$this->first();
//I need to evaluate something that was done in function first
if($neededVariable===1) {
//do something
}
}
现在最好的做法是什么?据我所知,有两种选择:
- 让
first()
函数用$this->value = 1;
设置成员变量并用second()
函数访问那个变量。
2.The first()
函数可以 return $neededVariable
.
它们都给出相同的结果,但如果有最佳实践,我正在措辞。也许一个比另一个有更好的性能,或者仅仅是因为选择选项 1/2 是惯例。
非常感谢任何答案!
提前致谢:)
在您提到的第一种方法中,我们只是调用一个例程(函数),并且创建的成员变量的 space 已经被使用,因此不再需要内存,
而在第二个中,如果从该子例程返回值,则将需要另一个临时变量来存储该数据。它们都有相同的结果,但您会在不知不觉中为第二种方法中的临时变量创建一个内存块。
class Test
{
private $value;
function first()
{
if("this"=="that") {
$neededVariable = 1;
}
return $neededVariable;
}
function second()
{
//either you create a variable or use directly the function in if..
//both will require that temporary memory block.
$var = $this->first(); //or if($this->first() == 1)
if($var ===1) {
//do something
}
}
我觉得1号更好
因为如果你使用 no.2,每次调用 second() 时,first() 也会在 func second 中调用。(当 first 需要大量 cpu 时,对 cpu 不利用法)
不过2号也有一些好东西。每次你想第二次使用 func 时,你应该先调用 func,除非 $value 将为 null。如果您想在不同的页面中使用此 class,这很糟糕。
将first 的结果存储在$this 中意味着修改对象的状态。仅仅使用它来传递结果是糟糕的设计,因为代码的 reader 将假定对象状态的修改具有更深层次的含义。更糟糕的是,调用 second() 也会以与 first() 相同的方式修改对象的状态 - 这是您代码的用户所期望的吗?
如果修改对象的状态是 first() 的预期目的,并且用户很清楚 second() 会产生相同的效果,则设置 $ first() 中的 this->value 并在 second() 中调用 first() 是很好的设计。
但是,如果您只想共享逻辑,只需编写一个仅重用逻辑的函数即可。这样,您就可以将设置状态与重用逻辑分开。
class Test
{
private $value;
private function evaluate() {
$neededVariable = 0;
if ("this"=="that") {
$neededVariable = 1
}
return $neededVariable;
}
function first()
{
$this->value = $this->evaluate();
}
function second()
{
$neededVariable = $this->evaluate();
if($neededVariable===1) {
//do something
}
}
}
我一直在想一些事情,我希望有人能为我澄清。
假设我们有一个 class
class Test
{
private $value;
function first()
{
if("this"=="that") {
$neededVariable = 1;
}
}
function second()
{
$this->first();
//I need to evaluate something that was done in function first
if($neededVariable===1) {
//do something
}
}
现在最好的做法是什么?据我所知,有两种选择:
- 让
first()
函数用$this->value = 1;
设置成员变量并用second()
函数访问那个变量。
2.The first()
函数可以 return $neededVariable
.
它们都给出相同的结果,但如果有最佳实践,我正在措辞。也许一个比另一个有更好的性能,或者仅仅是因为选择选项 1/2 是惯例。
非常感谢任何答案!
提前致谢:)
在您提到的第一种方法中,我们只是调用一个例程(函数),并且创建的成员变量的 space 已经被使用,因此不再需要内存, 而在第二个中,如果从该子例程返回值,则将需要另一个临时变量来存储该数据。它们都有相同的结果,但您会在不知不觉中为第二种方法中的临时变量创建一个内存块。
class Test
{
private $value;
function first()
{
if("this"=="that") {
$neededVariable = 1;
}
return $neededVariable;
}
function second()
{
//either you create a variable or use directly the function in if..
//both will require that temporary memory block.
$var = $this->first(); //or if($this->first() == 1)
if($var ===1) {
//do something
}
}
我觉得1号更好
因为如果你使用 no.2,每次调用 second() 时,first() 也会在 func second 中调用。(当 first 需要大量 cpu 时,对 cpu 不利用法)
不过2号也有一些好东西。每次你想第二次使用 func 时,你应该先调用 func,除非 $value 将为 null。如果您想在不同的页面中使用此 class,这很糟糕。
将first 的结果存储在$this 中意味着修改对象的状态。仅仅使用它来传递结果是糟糕的设计,因为代码的 reader 将假定对象状态的修改具有更深层次的含义。更糟糕的是,调用 second() 也会以与 first() 相同的方式修改对象的状态 - 这是您代码的用户所期望的吗?
如果修改对象的状态是 first() 的预期目的,并且用户很清楚 second() 会产生相同的效果,则设置 $ first() 中的 this->value 并在 second() 中调用 first() 是很好的设计。
但是,如果您只想共享逻辑,只需编写一个仅重用逻辑的函数即可。这样,您就可以将设置状态与重用逻辑分开。
class Test
{
private $value;
private function evaluate() {
$neededVariable = 0;
if ("this"=="that") {
$neededVariable = 1
}
return $neededVariable;
}
function first()
{
$this->value = $this->evaluate();
}
function second()
{
$neededVariable = $this->evaluate();
if($neededVariable===1) {
//do something
}
}
}