PHP中的面向对象

面向对象编程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 />';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,242评论 6 13
  • PHP面向对象的语法,面向对象只可意会不可言传,万物皆对象: 定义类 创建类对象(实例化) 使用对象 对象创建方式...
    kangyiii阅读 481评论 0 3
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,837评论 0 9
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,205评论 0 2
  • 文/彧渊玖儿 那张泛黄的横格纸 那排密密麻麻的繁体字 当时的你, 是否也像现在的我 这般感动、惊喜 几十载风风雨雨...
    辞不尽意阅读 766评论 2 4