美文网首页
PHP中的面向对象

PHP中的面向对象

作者: overisover | 来源:发表于2017-03-05 20:24 被阅读0次

    面向对象编程OOP,

    一切已对象为核心,关注的是项目中需要哪些对象,每个对象上能实现哪些功能;
    概念:
    类:拥有相同属性和相同行为对象的统称;如:学生,电脑,---学生属性(姓名,年龄,住址),只能知道有哪些属性,不知道具体的值;
    对象:属性以及操作属性行为的集合体;可以知道具体的属性值,

    面向过程

    主要实现功能

    声明类

    1.定义类:

    class 类名{
          属性
          方法
    }
    

    2.创建对象
    $obj=new Rect();

    class Rect{
    //申明静态属性
        var $width=0;
        var $height=0;
    //动态属性,行为即方法
    function getLen(){
        //$this 是指当前对象的属性,对象与属性连接方式:->,$this->width,获取当前对象的width属性
        return ($this->width+$this->height)*2;
    }
        
    }
    //创建对象
    $rect1=new Rect();//创建具体的对象
    $rect1->width=40;//设置该对象的具体属性
    $rect1->height=40;
    $len=$rect1->getLen();//调用对象上的方法,获取该对象的周长;
    echo 'rect1的 长:'.$rect1->width.' 高:'.$rect1->height.' 周长:'.$len;
    

    每个类都有__toString(){}将对象转换为字符串,,return 回去的是转换结果

    将字符串转为数组:explode(分隔符,字符串)
    将数组转为字符串 :join(连接符,数组)

    构造方法

    __construct([形参列表]){}
    //构造方法--是在创建对象是自动调用该方法,主要用于初始化对象

    析构方法

    __destruct([形参列表]){}
    //当对象销毁时自动执行,用于释放资源和垃圾对象(垃圾对象是一个对象没有相应的引用名称,或对象销毁时)

    class Person{
        var $name;
        var $pwd;
        var $telephone;
        function __construct($name,$password,$tel){
            //构造方法--是在创建对象是自动调用该方法,主要用于初始化对象
            $this->name=$name;
            $this->psw=$password;
            $this->telephone=$tel;
            $this->introduce();//创建后自动调用函数
        }
    
        function introduce(){
            echo '我的账号:'.$this->name.'我的密码'.$this->psw;
        }
        function __destruct(){
            echo '<br/>';
            echo $this->name.'此变量已经销毁<hr/>';
        }
    }
    
    $jack=new Person('jack','aaaa','123234');//jack我的密码aaaa
    var_dump($jack);
    //unset($jack);//手动销毁的话,立马执行;
    $jam=new Person('jam','bbbb','2222');//jam我的密码bbbb
    //没有手动销毁时,执行顺序是,先jam,后jack;先进后出原则;
    

    创建一个点类(计算任意两点间的距离公式是:[A(x1,y1)、B(x2,y2)]

    //计算这两点间的距离:((x1-x2)2+(y1-y2)2)开根) pow(x,y),sqrt(144)

    class point{
        var $x;
        var $y;
        function __construct($x,$y){
            $this->x=$x;
            $this->y=$y;
        }
        function dis($point){
            return sqrt(pow($point->x-$this->x,2)+pow($point->y-$this->y,2));
        }
    }
    
    $point2=new point(10,50);
    $point1=new point(10,90);
    echo $point1->dis($point2);//40
    

    对象的特征->封装

    将安全性高的信息隐藏起来;通过访问的控制符来实现
    访问控制符:private ,protected,public 用于修饰方法及属性,主要控制他们的可见性,放在属性,方法之前
    private :私有的,只有本类才能使用;
    protected:受保护的,只有本类中子类才能使用;
    public :公有的,本类,子类,类外部可以使用;

    var 关键词只能修饰属性,不能修饰方法,同public;

    魔术方法__set(),__get()__call(){}

    • __set($name,$value)---当对象设置不存在的属性时或者没有权限的属性时自动调用此方法,需要两个形参分别用于接收属性名以及属性值
    • __get($name)---当对象访问不存在的属性时或者没有权限的属性时自动调用此方法;
    • __call($name,$arguments)**
    • __call($name,$arguments)---当对象调用不存在的方法或者无权限访问的方法时自动调用该方法,$name---方法名,$arguments接收的是方法传递的参数,是数组**
    • _callStaric($name,$arguments)当调用不存在的静态方法时调用**

    property_exists(CLASS,$name) 检测某类中是定义指定属性;
    class_exists(类名) 检测类是否存在
    is_file(文件路径)检测文件是否存在
    method_exists(类名|对象,方法名),判断方法名是否存在
    _CLASS_获取当前类名
    _METHOD_获取当前方法名//类,对象里面叫方法,外面是函数
    _FUNCTION_获取当前函数名
    trigger_error()

    class Img{
        private $src = '';
        private $width;
        private $height;
        public function __construct($src,$w,$h){
            $this->checkSrc($src);
            $this->checkNum($w);
            $this->checkNum($h);
            $this->src = $src;
            $this->width = $w;
            $this->height = $h;
        }
    
        public function __set($name, $value){
            if(property_exists(__CLASS__,$name)){
                //只有定义了的属性才能设置
                $fn = '';
                if($name=='src'){
                    $fn = 'checkSrc';
                }else if(array_search($name,['width','height'])!==false){
                    $fn = 'checkNum';
                }
                $this->$fn($value);
                $this->$name = $value;
            }
        }
    
        public function __get($name){
            if(property_exists(__CLASS__,$name)){
                return $this->$name;
            }
        }
    
        private function checkSrc($path){
            if(!is_file($path)){
                trigger_error($path.'文件不存在!',E_USER_ERROR);
            }
        }
    
        private function checkNum($num){
            if(!is_int($num)){
                trigger_error($num.'不是有效的整型!',E_USER_ERROR);
            }
        }
    }
    $img = new Img('upload/24.jpg',100,200);
    $img->src = 'upload/20.jpg';
    $img->width = 200;
    echo $img->width.'<br />';
    echo $img->src.'<br />';
    echo $img->path.'<br />';
    $img->height = 300;
    var_dump($img);
    
    class Shape{
    //    var $width;   //var关键词只能修饰属性,相当于public,推荐使用public
    //    public $height;
    //    public $width;
    //    public $height;
    //***要求width与height只能是整型,需要将此属性变成非公有的,避免在类外部随意设置值而不能相应的处理
        private $width;
        private $height;
    
        public function __construct($w,$h){
    //        echo __CLASS__;  //当前类名
            $this->isInt($w);
            $this->isInt($h);
            $this->width = $w;
            $this->height = $h;
        }
    
        public function setValue($key,$value){
            //设置宽与高
            if(property_exists(__CLASS__,$key)){
                //property_exists(类名,属性名)----检测类是否定义了指定的属性名
                $this->isInt($value);
                $this->$key = $value;
            }
        }
    
        public function getArea(){
            return $this->width*$this->height;
        }
    
    
        public function justType(){
            return $this->width==$this->height?'正方形':'长方形';
        }
    
        private function isInt($value){
            if(!is_int($value)){
                trigger_error($value.'不是整型,请重新传值',E_USER_ERROR);  //trigger_error(msg)----触发一个错误信息
            }
        }
    }
    
    $s1 = new Shape(30,20);
    echo $s1->getArea().'<br />';
    $s1->setValue('width',50);
    $s1->setValue('height',10);
    echo $s1->getArea().'<br />';
    

    相关文章

      网友评论

          本文标题:PHP中的面向对象

          本文链接:https://www.haomeiwen.com/subject/rwxzwttx.html