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 在这方面并不是唯一的 - 其他脚本语言也使用显式 this
(self.foo
、@foo
),原因是这些语言没有声明,所以当你有 foo=1
时,编译器不可能决定你是在为字段分配新值还是引入新的局部变量。
我目前正在 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 在这方面并不是唯一的 - 其他脚本语言也使用显式 this
(self.foo
、@foo
),原因是这些语言没有声明,所以当你有 foo=1
时,编译器不可能决定你是在为字段分配新值还是引入新的局部变量。