不在对象上下文中时使用 $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。如下所述,这会将您的错误更改为新错误,因为它也需要将变量声明为静态。

当然,您确实需要弄清楚为什么将这些函数设为静态。它们应该是静态的吗?

这里有两个问题:

  1. 您已将方法定义为 static。你不应该这样做,因为它们不是,它们依赖于在你想要使用对象非静态属性的对象上被调用。

  2. 您的构造函数中有错字。构造函数的正确名称是 __construct,注意开头的两个 _

您正在尝试从静态方法访问 $this 属性。您不能这样做,因为可以在不实例化 class 的情况下访问任何静态内容,因此 $this 变量没有意义,因为您不在实际的 class 实例中。

this 关键字指的是您正在使用的当前对象,例如如果你要创建 5 个 person 实例,每个 $this 将引用那个特定的 person 实例,你可以自由更改每个对象的属性。

当您使用 static 时,您并没有引用任何实例,您只是访问静态变量并调用该 class 的静态方法。所有这些变量和方法都是'class wide'。这意味着如果您在 class 的一个实例中更改静态 属性,则静态 属性 将在所有 class 中更改。

另一种想象方式是,调用 new 关键字时,您创建了对象的新实例。每个实例都将拥有您在 class 中描述的所有属性和方法的副本,静态实例除外。想象一下,当您访问静态方法或静态 属性 时,您总是在访问一个对象。

这就是为什么从静态上下文访问 $this 没有意义。您指的不是任何特定实例,仅指 class 本身。

我希望我已经解释得足够好,这是 OOP 中一个非常重要的概念,它确实给一些人理解这个概念带来了很多麻烦。