Използване на общи гетери и сетери с php

Има хиляди примери за php __get и __set, но за съжаление никой всъщност не ви казва как да ги използвате.

Така че въпросът ми е: как всъщност да извикам метода __get и __set от класа и когато използвам обект.

Примерен код:

class User{
public $id, $usename, $password;

public function __construct($id, $username) {
         //SET AND GET USERNAME
}

public function __get($property) {
    if (property_exists($this, $property)) {
        return $this->$property;
    }
}

public function __set($property, $value) {
    if (property_exists($this, $property)) {
        $this->$property = $value;
    }

    return $this;
}
}

$user = new User(1, 'Bastest');
// echo GET THE VALUE;

Как да задам стойностите в конструктора и как да получа стойността в // echo GET THE VALUE;


person inControl    schedule 25.09.2013    source източник
comment
Не съм сигурен какво сте прочели, но ви предлагам да прочетете официална страница с ръководство - тъй като очевидно не разбирате за кои цели са необходими __set() и __get().   -  person Alma Do    schedule 25.09.2013
comment
във вашия сетер, $this-›$property = $value; трябва да бъде $this-›$property = $value[0];   -  person Joe Love    schedule 11.10.2017


Отговори (1)


Тази функция се нарича overloading в PHP. Както се посочва в документацията, методите __get или __set ще бъдат извикани, ако опитвате се да получите достъп до несъществуващи или недостъпни свойства. Проблемът във вашия код е, че свойствата, до които имате достъп, съществуват и са достъпни. Ето защо __get/__set няма да бъде извикан.

Вижте този пример:

class Test {

    protected $foo;

    public $data;

    public function __get($property) {
        var_dump(__METHOD__);
        if (property_exists($this, $property)) {
            return $this->$property;
        }
    }

    public function __set($property, $value) {
        var_dump(__METHOD__);
        if (property_exists($this, $property)) {
            $this->$property = $value;
        }
    }
}

Тестови код:

$a = new Test();

// property 'name' does not exists
$a->name = 'test'; // will trigger __set
$n = $a->name; // will trigger __get

// property 'foo' is protected - meaning not accessible
$a->foo = 'bar'; // will trigger __set
$a = $a->foo; // will trigger __get

// property 'data' is public
$a->data = '123'; // will not trigger __set
$d = $a->data; // will not trigger __get
person hek2mgl    schedule 25.09.2013
comment
Благодаря, реших, че това е и го пробвах. Проблемът, разбира се, беше, че публичните променливи в моя пример трябва да бъдат частни, включете това във вашия отговор и аз ще го приема. - person inControl; 25.09.2013
comment
@inControl Можете също изрично да извикате $this->__set() или това $this->__get(). Това е интересно, ако имате достъп до защитени свойства от клас - person hek2mgl; 25.09.2013