Edited at

__get()、__set()メソッドをできるまで(想像)

More than 3 years have passed since last update.

class Hoge

{
public $a;
}

$hoge = new Hoge;
$a = $hoge->a;

(この方法だとカプセル化の観点から問題だな)

(プロパティをprivateにしてゲッタ、セッタをつけよう)

class Hoge

{
private $a;

public function setA($a)
{
$this->a = $a;
}

public function getA()
{
return $this->a;
}
}

$hoge = new Hoge;
$a = $hoge->getA();

(全部のメソッドに対してゲッタ、セッタ書くのめんどくさいな)

(プロパティを一個にしてしまおう)

(ついでにいちいちsetHoge()、getHoge()とかかなくてもいいようにプロパティに直接アクセスしようとしたら必ずよばれる__set()、__get()メソッドというものをつくろう)

class Hoge

{
private static $property = ['a'];
private $a;

function __set($name, $value)
{
if(in_array($name, static::$property)){
$this->a = $value;
}
}

function __get($name)
{
if(in_array($name, static::$property)){
return $this->a;
}
}
}

$hoge = new Hoge;
$a = $hoge->$a;

(うん、だいぶ良くなった。)

(このクラスよく使うから再利用可能なようにtrait化しておこう)

// file1

trait Hoge
{
function __set($name, $value)
{
if(in_array($name, static::$property)){
$this->a = $value;
}
}

function __get($name)
{
if(in_array($name, static::$property)){
return $this->a;
}
}
}

$hoge = new Hoge;
$a = $hoge->$a;

// file2
use Hoge;
protected static $property = ['a'];
protected $a;

・・こんなかんじかな?

参考:http://masutaka.net/chalow/2012-05-13-1.html