Blogger Information
Blog 71
fans 1
comment 1
visits 86938
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
502-PHP类之对象
小威的博客
Original
1252 people have browsed it
  • 效果图:

0502.png

  • 类文件源代码:


实例

<?php

class AvIt
{
	//声明属性
    private $name;
    private $age;
    private $stature;
    private $data=[];

    //构造方法
    public function __construct($name='',$age=0,array $stature=[])
    {
    	$this->name = $name;
    	$this->age = $age;
    	$this->stature = $stature;
    }

    //查询器-魔术方法
    public function __get($name)
    {
    	//加入检测:访问不存在的属性时给出提示信息
    	$msg = null;
    	if(isset($this->$name)) {
    		$msg = $this->$name;
    	//如果类中添加一个自定义的数据收集器$data,就从这里取值
    	} elseif (isset($this->data[$name])) {
    		$msg = $this->data[$name];
    	} else {
    		$msg = '无此属性';
    	}

    	return $msg;
    }

    //设置器-魔术方法
    public function __set($name, $value)
    {
    	//如果访问的是已存在的属性,则直接输出
    	if (isset($this->$name)) {
    		$this->$name = $value;  //不做检测直接设置 输出属性
    	} else {
    		//如果属性不存在,则创建它并保存到类属性$data数组中
    		$this->data[$name] = $value;
    	}
    }
}

运行实例 »

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


  • 类文件测试源代码:


实例

<?php 

//导入类
require './class/AvIt.php';

//访问类中声明的成员,必须先创建类的实例,即对象
$AvIt = new AvIt('吉泽明步',26,[98,88,86]);

//测试查询
echo '查询结果:','<br>';
echo '姓名:',$AvIt->name,'<br>';
echo '年龄:',$AvIt->age,'<br>';
echo '三围:',print_r($AvIt->stature,true),'<br>';

echo '绝技:','<font color="red">',$AvIt->stunt,'</font>','<br>';

echo '<hr color="blue">';

//设置属性
$AvIt->name = '本田莉子';
$AvIt->age = 35;
$AvIt->stature = [99,90,92];

echo '姓名:',$AvIt->name,'<br>';
echo '年龄:',$AvIt->age,'<br>';
echo '三围:',print_r($AvIt->stature,true),'<br>';

//添加一个新属性
$AvIt->stunt = '性教育';

echo '绝技:','<font color="green">',$AvIt->stunt,'</font>','<br>';

//使用类属性设置器__set()再创建一个新属性
$AvIt->works = '老师性教育';
echo '主要作品:','<font color="green">',$AvIt->works,'</font>','<br>';

echo '<hr color="blue">';

//直接查看用户自定义的类属性$data数组的内容,此时会输出二个自定义数据
echo '用户自定义属性<pre>'.print_r($AvIt->data,true).'</pre>';

运行实例 »

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


  • 知识点:


 Description of Girlfriend

 要求:

 * 1.类声明代码应该单独创建一个php文件

 * 2.类名必须要与类文件名一致

 * 3.必须使用命名空间(暂未学到,后面再说)

 * 

 * 当前类共有5个成员:3个属性,二个方法

 * 属性就是类中声明的变量,命名规则与普通变量完全一致

 * 方法就是类中声明的函数,与普通函数的命名与使用规则完全一样

 * 由于定义在类中,所以与普通变量与函数相比,有一些特殊地方,例如访问控制

 * 类成员访问控制,也叫外部可见性,目前不限制外部访问,统一设置为public(默认)

class GirlFriend1 
{
    //类属性:$name 姓名
    public $name = '冰冰姐';
    
    //类属性: 年龄
    public $age = 18;
    
    //类属性: 身材三维stature['stætʃə]: 胸,腰,臀
    public $stature = [90,80,90];
    
    //类方法: getInfo() 获取女友姓名和年龄
    public function getInfo($name='',$age=0)
    {
        //对象属性初始化
        $this->name = empty($name) ? $this->name : $name;
        $this->age = ($age==0) ? $this->age : $age;  
        
        //返回当前对象的name与age属性值
        return '姓名:'.$this->name.',年龄:'.$this->age.'<br>';
    }
    
    //类方法: getStature() 获取女友身材信息
    public function getStature($stature=[])
    {
        //对象属性初始化
        $this->stature = empty($stature) ? $this->stature : $stature;
        
        return '胸围:'.$this->stature[0].',腰围:'.$this->stature[1].',臀围:'.$this->stature[2].'<br>';
    }        
}

构造方法与访问控制(查询器与设置器)

构造方法:

 * 1.方法名固定: __constructor()

 * 2.功能: 声明对象创建时需要自动完成的操作,例如初始化对象属性,或者自动调用类中的方法

 * 3.一个规范的类,必须要有且只能有一个构造方法

 补充:以双下划线开始的方法,叫魔术方法,与普通方法相比:

 * 1.调用者不同: 由对象直接调用,用户没有权限

 * 2.调用场景不同: 在特定的场景下才可以调用,并且是自动调用

常见的触发魔术方法调用的场景有:

 * 1.对象初始化; 2.对象属性的查询与设置;3.对象克隆;4.对象序列化;5.对象销毁;6.其它场景... 

//类属性:$name 姓名
    private $name = '';
    
    //类属性: 年龄
    private $age = 0;
    
    //类属性: 身材三维stature['stætʃə]: 胸,腰,臀
    private $stature = [];
    
    //声明构造方法
    public function __construct($name,$age, array $stature) {
        //初始化类成员属性
        $this->name = $name;
        $this->age = $age;
        $this->stature = $stature;
    }


     * 如果类中声明了构造方法,则属性在声明时不需要进行初始化

     * 你可能会奇怪,既然不再需要初始始,为什么还要给$name一个空字符串,$age为0,$stature为空数组?

     * 原因是:php是弱类型语言,目前数组与对象已经支持类型提示,但是标量,如字符串,数值型仍不支持,

     * 所以给属性给一个代表其类型的初始值,可以起到类型提示的作用,这是一一个好习惯  

  

     * 类中通过构造方法对类属性进行了初始化,就不再需要在类的外部,直接通过赋值的方式进行类属性初始化了

     * 所以类的属性,也没必要让外部直接获取,为了安全,也为了数据封装的需要,类属性应该不允许外部直接访问

     * 使用private 关键字来修饰类属性就可以

     * private: 只能在本类方法中访问,不能被外部,或者子类访问 


     * 如果类中属性为私有,那么应该对外提供一个访问接口

     * 该接口通过类方法来实现,访问控制为public,即类外部可访问

     * 可以在接口方法中,对外部的访问进行必要的检测,确保请求合法,数据安全有意义

     * 对于外部的查询(即读)操作,设置查询器方法来解决

     * 查询器方法名推荐为: get+属性名,属性名首字符大写,采用驼峰命名法

     * 查询器通常不需要传入参数,如果传入参数,一般是查询条件***

 //查询器: getName() 获取女友姓名
   public function getName()
   {   
       //返回当前对象的name属性值
       return $this->name;
   }
    
    //通过查询器限制非法用户对类属性的访问
   public function getName($yourName='')
   {
       if (!empty($yourName) && $yourName != '西门大官人' ) {
           return $this->name;
       }
       return '非法访问';
   }
    
    //一个方法中,尽可能只用一个return,否则会警告return语句过多,建议做如下修改
    //添加一个临时变量,这样可确保方法内只会一个return语句
    public function getName($yourName='')
    {
        //创建方法内部变量(局部变量),用来保存要返回的信息
        $msg = '非法访问';
        if (!empty($yourName) && $yourName != '西门大官人' ) {
            $msg = $this->name;
        }
        return $msg;
    }
 //下面对年龄和三维的访问,你也可以通过对姓名的限制方式进行访问控制
    //查询器: getAge() 获取女友年龄
    public function getAge()
    {   
        //返回当前对象的age属性值
        return $this->age;
        //下面是改写一下当前方法,加入一些逻辑判断,仅做演示,实际功能自己扩展
        $msg = $this->age;
        if ($msg >= 50) {
            $msg .= ', 口味够重呀,大兄弟~~';
        } elseif ($msg < 18) {
            $msg .= ', 未成年呢,求放过~~';
        }        
        return $msg;
    }
    
    //查询器: getStature() 获取女友身材信息
    public function getStature()
    {
        //返回当前对象的$stature属性值
        return $this->stature;
    }

     * 设置器:也叫修改器,允许外部修改类的属性值

     * 参数一般有二个: 属性名与新的属性值

     * 因为属性名在方法中已经指定,这里只需要传入一个新的属性值即可

//下面通过设置器来控制对类属性的修改操作
    public function setName($value='')
    {
        return $this->name = $value;
    }
    
    //设置器更多的应用场景是会属性值进行过滤检测,例如年龄的范围
    public function setAge($value)
    {
        //年龄必须在18~120之间
        if (in_array($value,range(14,120))){
            $this->age = $value;
        }
    }
  • 魔术方法:_get()和__set()

 * 1.类魔术方法:__get(),__set()实现属性查询器和设置器

 * 2.魔术方法之前介绍过了,需要特定场景触发,由对象自动调用

 * 3.__get($name): 外部通过对象获取对象私有属性或不存在的属性时自动触发

 * 4.__set($name,$value):外部设置私有属性或不存在属性值的时候自动触发

 * 5.魔术方法可以适用于所有存在或不存在的类属性,不需要再为每个属性创建对应的访问接口



Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post