PHP 类与对象 —— 重载

  1. 动态地“创建”类属性和方法。
  2. 通过魔术方法(magic methods)来实现。
  3. 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
  4. 所有的重载方法都必须被声明为 public。
//在给不可访问属性赋值时,__set() 会被调用。
//参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。
public __set ( string $name , mixed $value ) : void
//读取不可访问属性的值时,__get() 会被调用。
public __get ( string $name ) : mixed
//当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用
public __isset ( string $name ) : bool
//当对不可访问属性调用 unset() 时,__unset() 会被调用。
public __unset ( string $name ) : void
<?php
class PropertyTest {
     /**  被重载的数据保存在此  */
    private $data = array();

 
     /**  重载不能被用在已经定义的属性  */
    public $declared = 1;

     /**  只有从类外部访问这个属性时,重载才会发生 */
    private $hidden = 2;

    public function __set($name, $value) 
    {
        echo "Setting '$name' to '$value'\n";
        $this->data[$name] = $value;
    }

    public function __get($name) 
    {
        echo "Getting '$name'\n";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  PHP 5.1.0之后版本 */
    public function __isset($name) 
    {
        echo "Is '$name' set?\n";
        return isset($this->data[$name]);
    }

    /**  PHP 5.1.0之后版本 */
    public function __unset($name) 
    {
        echo "Unsetting '$name'\n";
        unset($this->data[$name]);
    }

    /**  非魔术方法  */
    public function getHidden() 
    {
        return $this->hidden;
    }
}

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a;//调用__set()方法,$name = a, $value = 1

var_dump(isset($obj->a));//调用__isset()方法
unset($obj->a); //调用__unset()方法
var_dump(isset($obj->a));


echo $obj->declared; 
echo $obj->getHidden();//调用getHidden()返回2,还会调用__get()方法输出“Getting 'hidden'”
echo $obj->hidden;//报错

方法重载

//在对象中调用一个不可访问方法时,__call() 会被调用。
public __call ( string $name , array $arguments ) : mixed
//在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
//$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
public static __callStatic ( string $name , array $arguments ) : mixed
<?php
class MethodTest 
{
    public function __call($name, $arguments) 
    {
        // 注意: $name 的值区分大小写
        echo "Calling object method '$name' "
             . implode(', ', $arguments). "\n";
    }

    /**  PHP 5.3.0之后版本  */
    public static function __callStatic($name, $arguments) 
    {
        // 注意: $name 的值区分大小写
        echo "Calling static method '$name' "
             . implode(', ', $arguments). "\n";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');//调用__call()方法,在对象中调用一个不可访问方法

MethodTest::runTest('in static context');  // PHP 5.3.0之后版本,在静态上下文中调用一个不可访问方法
输出
Calling object method 'runTest' in object context
Calling static method 'runTest' in static context
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值