As their name says, protected and private members in PHP are not directly accessible from outside a given class. When you define such members, usually you should set a getter to retrieve their values or just to access them even outside a class definition. The problem with getters is that you should define a getter for each member you want to access. Fortunately, PHP provides the magic method called __get()
for that purpose.
Inside a given class, you define this magic method by strictly following this syntax:
public function __get($prop) { return $this->$prop; }
And you're done. Now, let's build a test. Given the following class:
class A { public $a = 'Public'; protected $_b = 'Protected'; private $_c = 'Private'; }
Accessing a public method is really easy:
$A = new A(); echo $A->a;
This will simply output 'Public', as expected. But if you try to access a protected or private member without a getter:
try { echo $A->_b; echo $A->_c; } catch(Exception $e) { echo $e->getMessage(); }
you get a fatal error:
Fatal error: Cannot access protected property A::$_b
So you have to rewrite your class as follows:
class A { public $a = 'Public'; protected $_b = 'Protected'; private $_c = 'Private'; public function __get($prop) { return $this->$prop; } }
And if you try to test this out:
$A = new A(); echo $A->a . '<br/>'; try { echo 'Using __get() ... ' . '<br />'; echo $A->_b . '<br/>'; echo $A->_c; } catch(Exception $e) { echo $e->getMessage(); }
you get your desired result.