回报$ something之间的区别; vs return $ this->某事

时间:2015-02-14 10:02:16

标签: php class oop getter-setter

我目前正在学习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

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

例如,如果我写:

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

然后,在两个示例中,getter方法将始终具有UserModel对象的引用。那么,它们是相同还是不同?如果它们不同,那么它们之间有什么区别?任何人都可以解释两种情况在不同情

很抱歉,我是OOP的新手。请帮帮我们。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这两个陈述略有不同:

$this->$something;

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

$something

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

答案 2 :(得分:1)

当您在程序中使用名称(标识符)时,编译器/解释器需要获取其值。为此,它查询其名称为>值对的内部表,称为“范围”。如果在当前作用域中找不到该名称,则在可能的情况下,它会查询另一个作用域,直到没有其他作用域可供查找 - 在这种情况下,它会因为抱怨名称未定义而大喊大叫。此过程称为“名称解析”,范围在“范围链”中链接在一起。

我不懂Java,但我认为它的名称解析如下:

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

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

PHP的解析规则不同且更简单:

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

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

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

答案 3 :(得分:0)

“This”是对您正在处理的“this”类变量的引用。

所以,返回$ something对你不起作用。它将返回null。 虽然$ this->某些东西会返回此类变量的值。

答案 4 :(得分:0)

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