переопределить статическую переменную

У меня есть два класса (Модель и Пользователь), но у меня есть проблема, поэтому я попытался объяснить это в простом примере:

class person
{
protected static $todo ="nothing";

public function __construct(){}

public function get_what_todo()
{
echo self::$todo;
}
}

class student extends person
{
protected static $todo ="studing";
}

$s = new student();
$s->get_what_todo(); // this will show the word (nothing)
//but I want to show the word (studing)

Пожалуйста, дайте мне решение, но без написания какой-либо функции в классе ученика, я только хочу делать там заявления 🙂 и спасибо 🙂

3

Решение

Принцип называется «поздняя статическая привязка«, и был введен в PHP 5.3.0; с self ключевое слово для доступа к свойству, определенному в вызывающем классе в дереве наследования, или static получить доступ к свойству, определенному в дочернем классе в этом дереве наследования.

class person
{
protected static $todo ="nothing";

public function __construct(){}

public function get_what_todo()
{
echo static::$todo;  // change self:: to static::
}
}

class student extends person
{
protected static $todo ="studying";
}

class teacher extends person
{
protected static $todo ="marking";
}

class guest extends person
{
}

$s = new student();
$s->get_what_todo(); // this will show the "studying" from the instantiated child class

$t = new teacher();
$t->get_what_todo(); // this will show the "marking" from the instantiated child class

$g = new guest();
$g->get_what_todo(); // this will show the "nothing" from the parent class,
//    because there is no override in the child class
8

Другие решения

Вы можете попробовать установить переменную в конструкции

class person
{
protected static $todo = null;

public function __construct(){
self::$todo = "nothing";
}

public function get_what_todo()
{
echo self::$todo;
}
}

class student extends person
{
public function __construct() {
self::$todo = "student";
}
}

$s = new student();
$s->get_what_todo();
2

Вы можете попробовать установить родительскую переменную в строительстве

class person
{
protected static $todo = null;

public function __construct(){
self::$todo = "nothing";
}

public function get_what_todo()
{
echo self::$todo;
}
}

class student extends person
{
public function __construct() {
parent::$todo = "student";
}
}

$s = new student();
$s->get_what_todo();
1
По вопросам рекламы [email protected]