return $something 之间的差异; vs return $this->something

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 是 returned。其次,$property 被 returned.

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

例如,如果我写:

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

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

抱歉,我是 OOP 新手。请大家帮忙。

在你的第二个例子中,return $email; returns 一个未定义的变量,或者换句话说:那是行不通的。对 UserModel 对象的崇敬是 $this 变量。如果要访问 class 方法或 属性.

,则始终需要使用 $this

两种说法略有不同:

$this->$something;

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

$something

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

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

所以,return $something 对你不起作用。它将 return 为空。 而 $this->something 将 return this class.

的变量值

简单地说,这是一种在对象中引用变量的方法。您在 class 的主体中创建的变量称为对象的属性,要访问它们,您需要引用它们所属的对象。由于您不知道将调用哪个对象变量,因此您需要使用 $this->variable ,其中 $this 是一个伪变量。

The pseudo-variable $this is available when a method is called from within an object context. $this is a reference to the calling object (usually the object to which the method belongs, but possibly another object, if the method is called statically from the context of a secondary object).

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

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() returns 局部变量只要定义就可以,但不会 return 属性 $email.

当您在程序中使用名称(标识符)时,compiler/interpreter 需要获取其值。为此,它会参考其内部 table 的名称=>值对,称为 "scope"。如果在当前范围内找不到该名称,它会咨询另一个范围,如果可能的话,直到没有更多的范围可供查找 - 在这种情况下,它会向您大喊大叫,抱怨该名称未定义。此过程称为 "name resolution" 并且作用域在 "scope chain".

中链接在一起

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

  • 当您看到(简单的)名称时,例如 foo、...
  • 看看是否在当前区块声明过
  • 如果失败,请查看外部块,直到我们达到 class 级别
  • 在 class 声明中查找是否存在具有此名称的字段
  • 如果失败,请进一步查看(包等)

所以当你在代码中写 foo 并且没有局部变量 foo 时,Java 将查找名为 foo.[=22= 的字段]

PHP的解析规则不一样,简单多了:

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

如您所见,class 声明不包含在范围链中,因此 $foo 永远不会引用字段 - 它始终是一个变量。这就是为什么在引用对象字段时总是必须使用显式 $this->

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