返回$something之间的差异;vs return$this->;某物


Difference between return $something; vs return $this->something

我目前正在学习PHP中的面向对象概念。我发现了一些getter和setter方法的例子:

示例1:

class UserModel{
    private $id,$name,$email;
    public function __construct(){}
    public function setid($id){
        $this->id=$id;      
    }   
    public function getid(){
        return $this->id;       
    }
    public function setname($name){
        $this->name=$name;
    }
    public function getname(){
        return $this->name;
    }       
    public function setemail($email) {
        $this->email=$email;
    }
    public function getemail() {
        return $this->email;
    }
}

示例2:

class UserModel{
    private $id,$name,$email;
    public function __construct(){}
    public function setid($id){
        $this->id=$id;      
    }   
    public function getid(){
        return $id;     
    }
    public function setname($name){
        $this->name=$name;
    }
    public function getname(){
        return $name;
    }       
    public function setemail($email) {
        $this->email=$email;
    }
    public function getemail() {
        return $email;
    }
}

正如您所注意到的,在第一个示例中,在getter方法中,返回$this->property。第二个返回$property

从手册中,我知道$this总是有调用对象的引用,所以在这种情况下,$this->property将确保它只返回调用对象的属性。但是,和第一个例子一样,return $property也应该有调用对象的引用。

例如,如果我写:

UserModel $user = new UserModel();
$user->setemail("example@so.com");
$user->getemail();

然后,在这两个示例中,getter方法将始终具有UserModel对象的引用。那么,它们是相同的还是不同的?如果它们不同,那么它们之间的区别是什么?有人能解释两者在不同场景下的工作方式是否不同吗?

对不起,我是OOP新手。请帮帮伙计们。

在程序中使用名称(标识符)时,编译器/解释器需要获取其值。为此,它会查阅名称=>值对的内部表,称为"scope"。如果在当前作用域中找不到该名称,它会咨询另一个作用域(如果可能的话),直到没有更多的作用域可查找为止——在这种情况下,它会对您大喊,抱怨该名称未定义。这个过程被称为"名称解析",作用域在"作用域链"中链接在一起。

我不知道Java,但我认为它的名称解析是这样的:

  • 当您看到一个(简单)名称,如foo
  • 看看它是否在当前块中声明
  • 如果失败,请查看外部块,直到达到类级别
  • 查看类声明中是否存在具有此名称的字段
  • 如果失败,请进一步查看(包等)

因此,当您在代码中编写foo,并且没有本地变量foo时,Java将查找一个名为foo的字段。

PHP的解析规则不同,而且简单得多:

  • 当你看到$foo
  • 查看它是否在当前函数中声明为global
  • 如果是,则为全局名称,否则为本地名称

正如您所看到的,类声明不包括在作用域链中,因此$foo永远不会引用字段——它总是一个变量。这就是为什么在引用对象字段时总是必须使用显式$this->

PHP在这方面并不是唯一的——其他脚本语言也使用显式thisself.foo@foo),原因是这些语言没有声明,所以当你有foo=1时,编译器不可能决定你是给字段分配一个新值还是引入一个新的局部变量。

在第二个例子中,return $email;返回一个未定义的变量,换句话说:这将不起作用。对UserModel对象的尊重是$this变量。如果要访问类方法或属性,则始终需要使用$this

这两个语句略有不同:

$this->$something;

上面的语句表示返回一个变量,即$something,它是当前类的对象的一部分。语句中的&this表示当前类的当前指针或引用,并返回该引用中的变量。

$something

在上面的语句中,使用了一个包含任何值的普通变量。

"This"是对您正在处理的"This"类的变量的引用。

所以,退回$something对你不起作用。它将返回null。而$this->something将返回此类变量的值。

简单地说,这是引用对象中变量的一种方式。你在类的主体中创建的变量被称为对象的属性,要访问它们,你需要引用它们所属的对象。因为你不知道会调用什么对象变量,所以你需要使用$this->变量,其中$this是一个伪变量。

当从对象上下文中调用方法时,伪变量$this可用$这是对调用对象的引用(通常是该方法所属的对象,但如果从辅助对象的上下文静态调用该方法,则可能是另一个对象)。

然后有一些局部变量只能在函数体中使用。

class Test {
    private $attribute; //This attribute can be used in methods by using $this->attribute
    function testFunction() {
        $local; //This variable can be used only in this function
    }
}

关于你的问题。在UserModel的示例2中,方法getemail()返回局部变量,只要定义了它就可以,但不会返回属性$email。