不在对象上下文中时使用 $this php
Using $this when not in object context php
我刚开始在 php 学习 OOPS。我写了一个简单的程序来实现继承。当不在对象上下文中时,我收到 $this 的致命错误。任何人都可以向我解释这个错误,这是什么意思?
这是我的代码:
<?php
class human{
public $gender;
public function _construct($gender)
{
$this->gender=$gender;
echo $this->get_gender();
}
public function get_gender()
{
return $this->gender;
}
}
class person extends human{
public $name;
public $surname;
public static function set_name($name)
{
$this->name=$name;
}
public static function set_surname($surname)
{
$this->surname=$surname;
}
public static function get_name()
{
return $this->name;
}
public static function get_surname()
{
return $this->surname;
}
}
$john = new person('male');
$john->set_name('John');
$john->set_surname('Williams');
echo $john->get_name().' '.$john->get_surname().'is a '.$john->get_gender();
?>
在静态函数中,$this
不存在。您可以使用 self::
引用 class 本身。因此,使用 self::surname
而不是 $this->surname
。如下所述,这会将您的错误更改为新错误,因为它也需要将变量声明为静态。
当然,您确实需要弄清楚为什么将这些函数设为静态。它们应该是静态的吗?
这里有两个问题:
您已将方法定义为 static
。你不应该这样做,因为它们不是,它们依赖于在你想要使用对象非静态属性的对象上被调用。
您的构造函数中有错字。构造函数的正确名称是 __construct
,注意开头的两个 _
。
您正在尝试从静态方法访问 $this 属性。您不能这样做,因为可以在不实例化 class 的情况下访问任何静态内容,因此 $this 变量没有意义,因为您不在实际的 class 实例中。
this 关键字指的是您正在使用的当前对象,例如如果你要创建 5 个 person 实例,每个 $this 将引用那个特定的 person 实例,你可以自由更改每个对象的属性。
当您使用 static 时,您并没有引用任何实例,您只是访问静态变量并调用该 class 的静态方法。所有这些变量和方法都是'class wide'。这意味着如果您在 class 的一个实例中更改静态 属性,则静态 属性 将在所有 class 中更改。
另一种想象方式是,调用 new 关键字时,您创建了对象的新实例。每个实例都将拥有您在 class 中描述的所有属性和方法的副本,静态实例除外。想象一下,当您访问静态方法或静态 属性 时,您总是在访问一个对象。
这就是为什么从静态上下文访问 $this 没有意义。您指的不是任何特定实例,仅指 class 本身。
我希望我已经解释得足够好,这是 OOP 中一个非常重要的概念,它确实给一些人理解这个概念带来了很多麻烦。
我刚开始在 php 学习 OOPS。我写了一个简单的程序来实现继承。当不在对象上下文中时,我收到 $this 的致命错误。任何人都可以向我解释这个错误,这是什么意思? 这是我的代码:
<?php
class human{
public $gender;
public function _construct($gender)
{
$this->gender=$gender;
echo $this->get_gender();
}
public function get_gender()
{
return $this->gender;
}
}
class person extends human{
public $name;
public $surname;
public static function set_name($name)
{
$this->name=$name;
}
public static function set_surname($surname)
{
$this->surname=$surname;
}
public static function get_name()
{
return $this->name;
}
public static function get_surname()
{
return $this->surname;
}
}
$john = new person('male');
$john->set_name('John');
$john->set_surname('Williams');
echo $john->get_name().' '.$john->get_surname().'is a '.$john->get_gender();
?>
在静态函数中,$this
不存在。您可以使用 self::
引用 class 本身。因此,使用 self::surname
而不是 $this->surname
。如下所述,这会将您的错误更改为新错误,因为它也需要将变量声明为静态。
当然,您确实需要弄清楚为什么将这些函数设为静态。它们应该是静态的吗?
这里有两个问题:
您已将方法定义为
static
。你不应该这样做,因为它们不是,它们依赖于在你想要使用对象非静态属性的对象上被调用。您的构造函数中有错字。构造函数的正确名称是
__construct
,注意开头的两个_
。
您正在尝试从静态方法访问 $this 属性。您不能这样做,因为可以在不实例化 class 的情况下访问任何静态内容,因此 $this 变量没有意义,因为您不在实际的 class 实例中。
this 关键字指的是您正在使用的当前对象,例如如果你要创建 5 个 person 实例,每个 $this 将引用那个特定的 person 实例,你可以自由更改每个对象的属性。
当您使用 static 时,您并没有引用任何实例,您只是访问静态变量并调用该 class 的静态方法。所有这些变量和方法都是'class wide'。这意味着如果您在 class 的一个实例中更改静态 属性,则静态 属性 将在所有 class 中更改。
另一种想象方式是,调用 new 关键字时,您创建了对象的新实例。每个实例都将拥有您在 class 中描述的所有属性和方法的副本,静态实例除外。想象一下,当您访问静态方法或静态 属性 时,您总是在访问一个对象。
这就是为什么从静态上下文访问 $this 没有意义。您指的不是任何特定实例,仅指 class 本身。
我希望我已经解释得足够好,这是 OOP 中一个非常重要的概念,它确实给一些人理解这个概念带来了很多麻烦。