php基础实战-类的实例化与重载(2018年9月3日)

2018年09月04日 16:36:10阅读数:872博客 / 大白鲸的博客 / PHP实战开发基础
  1. 类声明与实例化

实例

<?php
/**
 * 类的声明与实例化
 * 1. 类声明: class;
 * 2. 类的实例化: new
 * 3. 对象成员的访问:->
 */

//用关键字class声明一个类
class Test1
{
}
//用关键字 new 实例化一个类
$test1 = new Test1();

//给当前对象添加一些属性和方法
$demo1->name = '金刚';
$demo1->sex = '雄性';
$demo1->hello = function(){
    return '这是定义一个自定义的类方法';
};
//使用对象访问符:-> 来访问对象中的成员(属性和方法)
echo $demo1->name,': ',$demo1->sex,'<br>';

//错误的调用方式,因为当前对象方法不是一个普通函数,而是一个对象方法
//echo $demo1->hello();
//正确的调用方式,对象方法应该以回调的方式运行
echo call_user_func($demo1->hello);

2.类常量与类属性的重载

<?php
/**
 * 类常量,对象初始化,属性的重载
 * 1. 类常量可用来创建对象之间的共享数据
 * 2. 对象初始化: 用构造方法实现,创建对象之前会自动调用,完全对象的一些初始化工作
 *    例如:对象属性初始化,创建对象时自动调用的方法等,方法名称固定:__construct()
 * 3.属性重载:在类的外部访问不存在或者无权限访问的属性时,会自动触发此类方法调用
 *   属性重载涉及四个方法:__get(),__set(),__isset(),__unset()
 */

class Demo3
{
    //类常量:所有对象共享,用类名加范围解析符(::)访问,且默认为公共属性public
    //类常量可用来创建对象之间的共享数据
    const SITE_NAME = '新浪网';

    //声明二个私有属性
    private $name;
    private $course;
    private $grade;

    //构造方法
    public function __construct($name,$course, $grade)
    {
        $this->name = $name;
        $this->course = $course;
        $this->grade = $grade;
        //构造方法中不仅可以初始化对象属性,还可以调用类方法
        echo $this->show();
    }

    //输出属性内容
    public function show()
    {
        return $this->name.'的《'.$this->course.'》课程的成绩是: '.$this->grade.'分!';
    }

    //获取属性的重载
    public function __get($name)
    {
        if ($name == 'grade') {
            return $name.'不让看';
        }
        return $this->$name;
    }

    //更新属性的重载
    public function __set($name, $value)
    {
        if ($name == 'grade') {
            echo $name.'不允许修改','<br>';
        }
        $this->$name = $value;
    }

    //属性检测的重载
    public function __isset($name)
    {
        if ($name == 'grade') {
            return false;
        }
        return isset($this->$name);
    }

    //销毁属性的重载
    public function __unset($name)
    {
        if ($name == 'grade' || $name == 'name') {
            return false;
        }
        unset($this->$name);
    }
}

//访问类常量:类常量可以被该类的所有对象所共享,所以不属于任何一个对象,应该使用类来访问
echo '站点名称: ', Demo3::SITE_NAME, '<br>';

//实例化Demo3,创建对象
$demo3 = new Demo3('小皮','PHP', 82);
var_dump($demo3);
//访问属性,因为属性全部被封装,所以必须通过一个统一的外部接口访问
echo $demo3->show();
echo '<hr>';

//如果想简化以上操作,可以在实例化之前,在构造方法中调用属性访问接口方法
new Demo3('小皮','PHP', 82);
echo '<hr>';

//属性操作: 获取,设置,检测,销毁
//获取
echo '姓名: ', $demo3->name, '<br>';   // 访问私有属性,如类中无__get()会出错,如有自动触发
echo '成绩: ', $demo3->grade, '<br>';  // 可以在__get()进行属性访问的权限控制

//设置
$demo3->course = 'Python';
echo '课程: ', $demo3->course,'<br>';
$demo3->grade = 65;

//检测,因为grade私有,所以外部检测不到,如类中有__isset()方法就可以检测到
echo isset($demo3->name) ? '存在<br>' : '<span style="color:red">不存在</span><br>';
echo isset($demo3->grade) ? '存在<br>' : '<span style="color:red">不存在</span><br>';

//销毁
unset($demo3->course);
echo $demo3->course,'<br>';

unset($demo3->name);    // 重载方法中__unset()不允许销毁grade和name属性
echo $demo3->name,'<br>';   // 所以这里仍可以访问到name属性

运行实例 »

点击 "运行实例" 按钮查看在线实例



批改状态:合格

老师批语:

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    大白鲸的博客
    博文
    23
    粉丝
    0
    评论
    1
    访问量
    13498
    积分:0
    P豆:229