composer require ailixter/gears-overloading
use Ailixter\Gears\Props;
class TestProps
{
use Props;
private $myPri = 'my private';
public function getMyPri() {
return '*' . $this->myPri;
}
}
$test = new TestProps;
echo $test->myPri;
$test->myPri = 'new'; // PropertyException
or, for real (defined) props:
class TestRealProps
{
use Props;
private $myPri = 'my private';
protected function propertyGet($prop)
{
return $this->{$prop};
}
protected function propertySet($prop, $value)
{
$this->{$prop} = $value;
}
}
$test = new TestRealProps;
echo $test->myPri;
$test->myPri = 'new';
echo $test->undefined; // Notice
$test->undefined = 'some'; // perfectly ok
use Ailixter\Gears\StrictProps;
class TestStrictProps
{
use StrictProps;
private $myPri = 'my private';
}
$test = new TestStrictProps;
echo $test->myPri;
$test->myPri = 'new';
echo $test->undefined; // PropertyException
$test->undefined = 'some'; // PropertyException
use Ailixter\Gears\AutoGetSetProps;
class TestAutoGetSetProps
{
use AutoGetSetProps;
private $myPri;
}
$test = TestAutoGetSetProps;
echo $test->setMyPri('new')->getMyPri();
it's also possible to specify defaults in getters:
class TestAutoGetPropsWithDefaults
{
use Props, AutoGetSetProps;
private $myPri;
protected $myPro;
public function getMyPro($default = 'static default')
{
return $this->existingProperty('myPro', $default);
}
}
$test = TestAutoGetSetProps;
echo $test->myPro; // static default
echo $test->getMyPri('dynamic default'); // dynamic default
This enables you to delegate procedural property getting/setting.
use Ailixter\Gears\BoundProps;
class TestBoundProps
{
use BoundProps;
/** @var BoundPropsInterface */
private $myBoundPri;
}
$test = new TestBoundProps;
$test->myBoundPri = new TestPropsBinding;
$test->myBoundPri = 'new';
echo $test->myBoundPri;
use Ailixter\Gears\AbstractProxy;
class TestProxy extends AbstractProxy {}
class TestObject {
public $myPub = 'my public';
public function myFn () {
return __function__;
}
}
$test = new TestProxy(new TestObject);
echo $test->myPub;
$test->myPub = 'new';
echo $this->myFn();
or
class CustomProxy
{
use Proxy;
private $proxiedObject;
public function __construct($proxiedObject)
{
$this->proxiedObject = $proxiedObject;
}
}
or
class LazyProxy
{
use Proxy;
private $obj;
protected function getProxiedObject()
{
if (!$this->obj instanceof ProxiedObject) {
$this->obj = new ProxiedObject;
}
return $this->obj;
}
}