不在对象上下文中时使用 $this php

Ami*_*hal 2 php oop inheritance fatal-error

我刚开始在 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();
    ?>
Run Code Online (Sandbox Code Playgroud)

kai*_*naw 5

在静态函数中,$this不存在。您可以使用 来引用类本身self::。因此,请$this->surname使用来代替self::surname。如下所述,这会将您的错误更改为新错误,因为它还要求将变量声明为静态。

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

  • 不,这只有在属性也是静态的情况下才有效,但它们不在这里,也不应该是静态的。 (3认同)

jer*_*oen 5

这里有两个问题:

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

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