Since my tech book told me so, I'm wondering if that's true, for example:
class A {
public $attr = "hmm";
}
$a = new A();
echo $a->attr; // outputs hmm
well that works for me, the book says not in order to use it outside class it's not making a __get function. i'm confused a bit.
Both public
variables and magical __get()
methods are considered to be a bad practice. First ones cause objects to loose the data encapsulations, while magic getters/setters attract complexity.
It is common to performs some operations on the data in the setter, before it is assigned to a parameter. For example, you would validate email address. Or format of phone number. When instead you use magical __get
and __set
methods, you will have to do all of this in a single method.
Essentially, your magical setter turns in a huge cluster*uck of if .. else
statements of various depth.
Instead you should make a custom getter for instance's parameter that you want to manipulate:
class Book
{
private $title;
private $author;
public function __construct( $author = null, $author = null )
{
$this->title = $title;
$this->author = $author;
}
public function setTitle( $title)
{
$this->title = $title;
}
public function setAuthor( $author)
{
$this->author = $author;
}
}
Which is used as:
$instance = new Book('Jim Butcher');
$isntance->setTitle('Fool Moon');