PHP类与类成员的访问总结

原创 2018-11-24 13:26:38 427
摘要:一.类声明与实例化    + 类的声明:class 类名{}    + 类的实例化:new 类名();// 括号就是调用构造方法的        + 对象成员访问:       &

一.类声明与实例化

    + 类的声明:class 类名{}
    + 类的实例化:new 类名();// 括号就是调用构造方法的    
    + 对象成员访问:
         * 类内部:$this->name;
         * 类外部:$obj->name;

    类与对象
        * 1.类是对象的模板,对象是类的实例化;
        * 2.类的声明:class
        * 3.类的实例化:创建一个类的对象的过程:new

    类的声明:
        class 类名{}
        类名:必须是合法标识符,只能以字母或者下划线开始,后紧跟字母和下划线
        类名:行业规定,首字母大写
        类中成员:属性和方法
        属性:就是累变量,类常量
        方法:函数来表示

class Hero
{
    //定义类属性
    public $name = '廖化';
    public $sex = '男';
    public $age = 30;
    public $company = '蜀中无大将,廖化做先锋';

    //技能
    public function skill($type,$skillName)
    {
        //$this  是伪变量,始终指向当前类的实例对象
        //$this 只能用在类的内部,引用类的成员
        $name = $this->name;
        return $name . '正在使用'.$type.'属性技能---'.$skillName;
    }
    // 另一个方法
    public function anotherSkill($event)
    {
        $name = $this->name;
        return $name.'又使用了'.$event.'技能';
    }

}

    类的实例化
        1.使用关键字:new 类名
        2.返回的是对象类型的变量
        3.如何访问对象成员:对象变量->(对象运算符)访问对象的公共成员

//实例化类
$hero = new Hero();
echo gettype($hero).'<br>';
//访问对象中的属性
echo '姓名是'. $hero->name.'<br>';
echo '职位是'. $hero->company.'<br>';

//访问对象中的方法

echo $hero->skill('火焰','火焰打击').'<hr>';
echo $hero->anotherSkill('撞击');


二.类属性与类常量

    + 类属性:只能使用字面量构造方法来初始化,不能使用表达式
    + 类常量:
       - 类常量必须要用const 关键字声明
       - 类常量声明时必须初始化
       - 类常量推荐全部采用大写字母
       - 类常量可以被所有类实例所共享
       - 类常量必须使用类名来访问
           * 类内:self/static::CONST
           * 类外:类名::CONST


        1. 类的属性初始化

        2. 类常量初始化与访问

        3.构造方法

            3.1 在构造(创建)类实例对象的时候,自动调用

            3.2 以双下划线开头,这类方法有一个特殊的名称:魔术方法(事件驱动)

            3.3 主要用于初始化成员,或生成对象时自动完成的一些工作

class Stu
{
    public $name;    //属性初始化必须使用字面量或者构造方法
    public $course;  //属性初始化不允许使用表达式
    public $skill; //默认为null,抽象属性

    const NATION = 'CHINA';    //声明类常量NATION  不可修改不可删除

    public function __construct($name = '赵云', $course = 'php')    //创建构造方法 并传入初始化参数的默认值
    {
        $this->name = $name;
        $this->course = $course;
    }
    public function  getNation()
    {
//        return $this->name.'的国籍是:'. Stu::NATION.'<br>';  //不推荐这么使用
        //当前类的引用标识符 :self::
//        return $this->name.'的国籍是:'. static::NATION.'<br>';//等价于下面的
        return $this->name.'的国籍是:'. self::NATION.'<br>';
    }
}

$stu = new Stu();不向构造方法中传入参数  使用默认值
echo '姓名是:' . $stu->name . '课程是:'. $stu->course.'<br>';    //姓名是:赵云课程是:PHP    
$stu = new Stu('西门大官人','sql');
echo '姓名是:' . $stu->name . '课程是:'. $stu->course.'<br>';    //姓名是:西门大官人课程是:sql    

//::  就是范围解析符 ,作用域解析符
echo $stu->name.'的国籍是'.Stu::NATION.'<br>';        //使用Stu::NATION 来调用类中常量
echo $stu->getNation();

三.类的自动加载
    + __autoload():已淘汰!
    + spl_autoload_register():注册自动加载器  

    require 与include功能一样,但出错时处理机制不同
    include :没有导入成功,只给出警告,脚本仍然执行
    require :直接退出
    include_once :仅允许导入一次
    require = include +die /exit;
    include 'public/Car.php';
    include 'public/Mobile.php';

//自动加载器:最重要的一个参数就是一个回调    
spl_autoload_register(function($className){    // (当实例化一个页面中没有的类时调用,将类名传入回调)
    //推荐使用绝对路径
//    require 'public/'.$className.'.php';    
    require __DIR__.'\public\\'.$className.'.php';    //绝对路径拼接    引用这个文件
});
$car = new Car('兰博基尼','K3',10000000);
$mobile = new Mobile('魅族','X8',2000);
echo $car->brand.'-'.$car->model.':'.$car->price.'元<br>';    //成功使用类中属性
echo $mobile->brand.'-'.$mobile->model.':'.$mobile->price.'元<br>';    //成功使用类中属性

四.类成员的访问限制

    + 访问限制符   类的内部  类的继承上下文  类的外部
          public         允许           允许                 允许
        protected     允许           允许                
禁止
          private        允许          
禁止                禁止

    + public     公共访问符
    + protected  受保护的    类的外部不可访问,子类可以访问
    + private    私有的   仅允许类中使用  子类也不可以使用

//类成员的访问限制
class Staff
{
    //public 公共访问限制符  类的内部外部以及继承中都可以访问
    public $name;

    //protected :受保护的,仅在类内部,以及子类中使用,外部不可以访问
    protected $dept;

    //private: 私有的,仅在类的内部,子类以及外部不可访问
    private $salary;

    //构造方法(构造器)
    public function __construct($name,$dept,$salary)    //初始化类中属性
    {
        $this->name = $name;
        $this->dept = $dept;
        $this->salary = $salary;
    }

    //创建一个接口,来访问外部访问受限的数据
    public function getDept()
    {
        $res = $this->dept;
        if($this->name !== '张角'){
            return $res;
        }
        return '该员工在保密部门';
    }

    //给私有成员创建一个接口
    public function getSalary()
    {
        $res = $this->test();    //调用类中私有方法
        
        if($this->dept == '黄巾军部部长'){
            return '老板身边的人你也敢看,真心活腻了!';
        }
        return $res;
    }
    //创建一个私有方法,
    private function test() //私有方法 ,只能类中调用
    {
        $res = $this->salary;
        return $res;
    }
}
//$staff = new Staff('张角','黄巾军部部长',5000);
$staff = new Staff('曹嵩','副部长',3000);
echo '姓名是:'.$staff->name.'<br>';
//echo '部门是:'.$staff->dept.'<br>';    //受保护 不可直接访问
echo '部门是:'.$staff->getDept().'<br>';    //受保护 不可直接访问

//echo '工资是:'.$staff->salary.'<br>';    //私有的 不可直接访问
echo '工资是:'.$staff->getSalary().'<br>';    //私有的 不可直接访问






批改老师:韦小宝批改时间:2018-11-24 13:32:21
老师总结:不错不错很棒!作业依旧写的很完美!不要骄傲保持下去!继续加油吧!!

发布手记

热门词条