Как получить доступ к полю в PHP (геттеры и сеттеры)?

Вот пример из C#.

public class MyClass
{
int age  = 0;
// Свойства. Пока тут нет логики, но мы всегда можем её добавить.
public int Age{ get{return age;} set{age=value;} }
}

В PHP

class MyClass
{
private $field1 = 0; // Если бы это был массив, то $key имел бы смысл.
private $field2; // Как получить значение этого поля магическим методом __get?

// Зачем нам тут $key? У нас $field1 не массив, но без этого аргумента будет ошибка.
public function __get($key)
{
return $this->field1;
}

}

$myClass = new MyClass();
echo $myClass->$field1; // 0 Я обратился к полю через геттер.

Я не могу получить значение поля $field2 магическим методом __get. Конечно, я могу написать свой метод, но это будет уже не то. Передавать в $key параметр для выбора поля тоже странно.

Как в этом случае получить доступ к полю через геттер?

PS

Посмотрите, как в C# доступ к полю Age (которого нет) переадресуется на свойство Age (которое по сути разновидность метода) и начинает работать механизм сеттера и геттера в зависимости от того читаем ли мы поле или пишем в него значение.


Ответы (3 шт):

Автор решения: Владимир Клыков
<?php 
define ('_EOL',"\r\n");
class MyClass
{
  private $field1 = 1;
  private $field2 = 2;

  public function __get($key)
  {
    return $this->{$key};
  }
}

$myClass = new MyClass();
echo $myClass->field1 ._EOL; 
echo $myClass->field2 ._EOL; 

Output:

1
2
→ Ссылка
Автор решения: NaClnik

В PHP нет свойств, как в C#. Вместо этого пишут отдельные методы:

<?php
class MyClass
{
    private $field1 = 0;
    private $field2;
    
    public function getField1() {
        return $this->field1;
    }
    
    public function setFiled1($field1) {
        $this->field1 = $field1;
    }
    
    public function getField2() {
        return $this->field2;
    }
    
    public function setFiled2($field2) {
        $this->field2 = $field2;
    }

}

Магические методы здесь работают не так, как свойства в C#:

class MyClass
{
    private $field1 = 0;
    private $field2;
    
    public function __get($key)
    {
        // Здесь $key будет равно field3.
        return $this->field1;
    }
}

$instance = new MyClass();

$instance->field3; // В данном случае field3 передаётся аргументом в магический метод __get
→ Ссылка
Автор решения: Алексей Шиманский

Видимо надо что-то такое?

class MyClass {
  private $field1 = 1;
  private $field2 = 2;

  public function __get($key) {
      $getMethod = 'get' . $key;
      return $this->{$getMethod}();
  }
  
  private function getField1() {
      return 111;
  }
}

$myClass = new MyClass();
echo $myClass->field1;
→ Ссылка