php 面向对象

<?php
    header("content-type:text/html;charset=utf-8");
   
 
        对象:客观存在的任何一个物体
        类:  对对象的一个描述
        先有类  然后  通过类 实例化对象
 
        面向过程的编程:基于步骤
        面向对象的编程:基于对象
 
        三大优势:重用性   扩展性   灵活性
 
        三大特性:封装   继承   多态
 
//    关键字与方法      //
 
    //关键字
    /class new          public protected private                        static      final       instanceof          const       extends         clone
      final                   //可以修饰类和方法          被修饰的方法不能被重写   被修饰的类不能被继承
  
      instanceof         //可以认为是一个运算符   判断左边的对象是不是右边的类的实例化
 
      static                 //可以修饰属性和方法        访问方式使用范围操作符,不再通过对象访问
                                //类名::$静态属性名              类名::静态方法()
        self            // self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。     
 
        extends            // 类的继承
                                //class A{}
                                //class B extends A{}       类B继承了A
        interface   implements          //接口
        abstract        抽象类
 
    // 魔术方法  (自动调用)
            __construct             //实类化类的时候自动执行
            __destruct               //实类化类的结束时候最后一个执行的程序
 
            __set($key,$val)     protected private  //没有权限操作的时候调用此方法
            __get($key)             protected private  //没有权限操作的时候调用此方法
            __isset($key)
            __unset($val)
 
            __sleep            serialize    串行化    将对象转化为字符串
            __wakeup        unerialize      饭串行化    将已经转化为对象的字符串转化为对象
 
            //注:只能调用方法
            __call ($a(方法名),$b(数组))               //调用一个不存在的       (方法 )     时自动调用
            __callStatic ($a(方法名),$b(数组))       //调用一个不存在的   (静态方法)  时自动调用
 
            
            __toString ()         //返回值必须是一个字符串 用于一个类被当成字符串时应怎样回应
 
            __clone ()        clone    //被克隆的与原来的对象是同一个对象
 
            __autoload (待加载的类$class)     //实例化对象时自动加载        (主要是加载未定义的类)
 
 
实例:
 __construct
 __destruct         
构造方法 __construct与析构方法 __destruct 的实例;
//先进后出,后进先出。类似于瓶子放东西的道理。
 class test{
    public function __construct($name){
        $this->name=$name;
        echo "{$this->name}被构造。。。<br>";
    }
    public function __destruct(){
        echo "{$this->name}被析构。。。<br>";
    }
}
 
$t1 = new test("A");
$t2 = new test("B");
$t3 = new test('C');
$t4 = new test('D');
执行结果:
                A被构造。。。
                B被构造。。。
                C被构造。。。
                D被构造。。。
                D被析构。。。
                C被析构。。。
                B被析构。。。
                A被析构。。。
 
class A{
    public function __construct(){
        echo "class A....";
    }
}
class B extends A{
    public function __construct(){
        parent::__construct();
        echo "class B ....";
    }
}
$b = new B;
结果:class A....class B ....
-----------------------------------------------------------------------------------------
__set($key,$val)  protected private  //没有权限操作的时候调用此方法,键值操作
__get($key)         protected private  //没有权限操作的时候调用此方法,键操作
 
 
class base{
    protected $age = 18;
    private $name = '张三';
 
    public function __set($key,$val){   //参数:键和值
        $this->$key = $val;             //键的赋值
        return '设置'.$key.'的值是'.$val;
    }
 
    public function __get($key){    //参数:键
        return '获取的键是'.$key.'得到的值是'.$this->$key;
    }
}
 
$base = new base;
$base->age = 20;   //__set($key,$val)的键值设置
echo $base->age;
 
echo '<br>';
 
echo $base->name;       //__get($key),值得获取
---------------------------------------------------------------------------------------------
__isset($key,$val)          isset
__unset($val)
__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
class A
{
    public $name = 'aaaaaaaaaaaaa';
    protected $age = 18;
    private = 'B';
 
    public function __isset($key){
        return isset($this->$key);
    }
}
$a = new A;
if(isset($a->aaa)){
    echo 'Y';
}else{
    echo 'N';
}
---------------------------------------------------------------------------------------
__sleep             serialize        串行化        将对象转化为字符串
__wakeup        unerialize      反串行化     将已经转化为对象的字符串转化为对象
            class B
            {
                public $name = 'xxxxxxx';
                public $age = 18;
                public $sex = 'aaaaaaaaa';
 
                public function __sleep(){
                    return array('sex','age');          //反回一个数组,数组的元素(值)就是允许被串行化的属性
                }
 
                public function __wakeup(){
                    echo '<br>aaaaaaaa<br>';
                }
            }
 
            $b = new B;
 
            $str = serialize($b);
            echo $str;
 
            $obj = unserialize($str);
            var_dump($obj);
 
--------------------------------------------------------------------------------
__call ($a(方法名),$b(数组))               //调用一个不存在的       (方法 )     时自动调用
__callStatic ($a(方法名),$b(数组))       //调用一个不存在的   (静态方法)  时自动调用
//注:只能调用方法
 
    class A
    {
        public function __call($a,$b){
            echo '调用不存在的    方法      是自动调用';
        }
    }
 
    class B
    {
        public static function __callStatic($a,$b){
            echo '动用不存在的        静态方法        是自动调用';
        }
    }
 
    $a = new A;
    $a->say('属性名','数组');        //不存在的      方法      会自动调用  __call  方法
    $a->say();                               //可以没有参数
 
    B::say('属性名','数组');          //不存在的      静态方法      会自动调用  __callStatic  方法
    B::say();                                //可以没有参数
--------------------------------------------------------------------------------
__toString      //用于一个类被当成字符串时应怎样回应
    class A
    {
        public function __toString(){
            return '必须返回一个字符串';         //返回值必须是一个字符串
        }
    }
 
    $a = new A;
    echo $a;
 
--------------------------------------------------------------------------------
__clone     clone
 
                class A
                {
                    public function __clone(){
                        echo '__clone克隆!!!!!!!<br>';
                    }
                }
 
                $a = new A;
                $b = clone $a;              //需要使用  clone   关键字
 
                if($a == $b){     //不能使用===判断,因为是两个对象,可以使用instanceof来判断
                    echo '$a,$b两个是同一个对象';       //被克隆的与原来的对象是同一个对象
                }else{
                    echo '$a,$b两个不是同一个对象';
                }
--------------------------------------------------------------------------------
__autoload (待自动加载的类)     //实例化对象时自动加载(主要是加载类)   
单独写出来不在类中实现。
//__autoload 不是写在类中,而是写在类的外面
function __autoload($classname){        //$classname 必须参数,待加载的类名。
    $classpath = './'.$classname.'.class.php';  //加载类的文件路径
    if(file_exists($classpath)){
        include_once("$classpath");          //在有继承的情况下之加载一次。
    }else{
        echo '不存在';
    }
}
$a = new user;      //当被实例化时自动加载的类。
 
user.class.php     类文件
class user{
    public function __construct(){
        echo '我是自动加载的类';
    }
}
/   范围操作符       
 
            静态访问符    ::             成员操作符    ->                 parent  父类                  self     自己            $this   当前对象
 
            $this      对象    当前对象       使用的时候只能在类里面的方法里面
            parent     类      父类
            self       类      当前类
 
范围操作符:
            静态方法   A::show();
            静态属性   A::$属性名
            常量          A::常量名
 
 
class A
{
    public $name;
    public $age;
    public $sex;
 
    public function __construct($name,$age,$sex){
        $this->name = $name;
        $this->age = $age;
        $this->sex = $sex;
    }
}
 
class B extends A{
    public $size;
 
    public function __donstruct($name,$age,$sex,$size){
        parent::__construct($name,$age,$sex);  
       //或者  A::__construct($name,$age,$sex);  
        $this->size = $size;
    }
}
 
$b = new B('name','age','sex','size');
var_dump($b);
 
---------------------------------------------------------------------------------------
//static 静态方法与属性的访问不是通过对象访问,而是通过操作符 ::
//作用:   无论实例化了多少个对象,static定义的属性和方法只有一个。
class A{
    public static $name = '我的名字';
    public static function one(){
        // echo A::$name;    这两个输出是相同的意思,调用自己。
        echo self::$name;   //  操作符是 ::    
    }
}
// 可以不用实例化
A::one();           //访问静态方法的访问中间的操作符  ::
echo A::$name;      //访问静态属性。
----------------------------------------------
 final关键字,修饰方法和类
//final只能修饰的类和方法
//被修饰的类不能被继承,被修饰的方法不能重写。
//final 不能修饰属性
class A{   
     // final $name;     final 关键字不能修饰属性
     final public function one(){       //final修饰的方法
        echo 'aaaaaaaaaaaaaaaaaa';
    }
}
 
final class B{} //final要写在 class 的前面
 
-------------------------------------------------------------------------------------------------
/*
        define 定义常量,可以使用表达式,不能写在类里面
        const  定义常量,不能使用表达式,可以写在类里面
 
        类里面常量的访问方式,和静态一致,使用范围操作符来访问  如:  A::USER;
*/
//     面向对象的封装:///
             
                                public           protected           private
        外面                     Yes                  NO                  NO
        相关的类              Yes                  Yes                  NO
        自己                     Yes                  Yes                  Yes
 
        yes 支持    no 不支持
///      面向对象的继承    /
extends 继承
/*        
            描述:
                    php的继承只能是单继承(只能继承一个类)   但是可以被多个类继承
                    php的继承可以是多层继承    C继承B    B继承A    那么C里面就有了ABC三个类里面的所有东西
 
            属性的继承:
                   (可见属性 public protected ) 在子类中出现同名的属性,会被重写
                    (不可见属性 private) 在子类中出现同名的属性,会产生一个新的属性,互不影响
 
            方法的继承:
                    (可见属性 public protected ) 在子类中出现同名的方法,会被重写
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
	
                    (不可见属性 private) 在子类中出现同名的方法,会产生一个新的方法,互不影响
                    使用父类中的东西,可以使用范围操作符  parent::父类方法
*/
class A{
    public $name = '属性';
    public function one(){
        echo 'oneoneonoenoneoneone';
    }
}
class B extends A{
    public function one(){
        parent::one();  //重写的父类方法,
        echo '自己外加的';
    }
}
$b = new B();
$b->one();
///    单态设计模式:(最终只能得到一个对象)   
        
class A{
    public static $link = null;
 
    public function __construct(){
        echo '链接数据库';
    }
    public static function getconnect(){
        if(is_null(self::$link)){
            return self::$link = new A;
        }else{
            return self::$link;
        }
    }
}
$a = A::getconnect();
echo '<br>';
$b =  A::getconnect();
if($a === $b){
    echo 'Y';
}else{
    echo 'N';
}
 
结果:  //证明这是同一个对象。
链接数据库
Y
   多态设计模式:(不同对象通过同一个类产生不同结果) 
 
    class A{
    public function aa($obj){
        $obj->eat();
        echo '<br>';
        $obj->say();
    }
}
 
interface B{
    public function eat();
    public function say();
}
 
class Ba implements B{
    public function eat(){
        echo 'BaBaBaBaBaBaeateateateateateateat';
    }
    public function say(){
        echo 'BaBaBaBaBaBasaysaysaysaysaysaysaysaysaysaysaysaysay';
    }
}
 
class Bb implements B{
    public function eat(){
        echo 'BbBbBbBbBbBbeateateateateateateateateateat';
    }
 
    public function say(){
        echo 'BbBbBbBbBbBbsaysaysaysaysaysaysaysayssaysaysaysay';
    }
}
 
$a = new A;
$Ba = new Ba;
$Bb = new Bb;
 
$a->aa($Ba);
echo '<hr>';
$a->aa($Bb);
 
 
 
     抽象类       /
 
 abstract    抽象类 
 作用:抽象类不实现具体方法,具体方法由子类完成。
//定义抽象类 abstract
abstract class A{
    //abstract 定义抽象类的方法,这里没有花括号。子类必须实现这个抽象方法。
    abstract public function say();
 
    //抽象类可以有参数
    abstract public function eat($argument);
    //在抽象类中可以定义普通的方法。
     
    public function run(){
        echo '这是run方法';
    }
}
class B extends A{
    //子类必须实现父类的抽象方法,否则是致命的错误。
    public function say(){
        echo '这是say方法,实现了抽象方法';
    }
    public function eat($argument){
        echo '抽象类可以有参数 ,输出参数:'.$argument;
    }
}
$b =new B;
$b->say();
echo '<br>';
$b->eat('apple');
echo '<br>';
$b->run();
 
     接口       /
 
// interface 接口 implements 实现接口    是单继承 ,多实现。作用:定义规范。
 
interface  A{   //接口 没有 class 关键字。
    const AA = '接口可以有常量';       //接口中可以有常量,但是没有变量
    public function atest();    //接口方法没有修饰词,不能有(花括号)方法体。
}
interface B{
    public function btest();
}
interface C{
    public function ctest($argument);   //接口方法可以有参数。
}
//接口可以多实现,单继承
class D implements A,B,C{
    public function atest(){}       //每个接口的方法都必须实现。
    public function btest(){}
    public function ctest($argument){
        echo '这是ctest方法';
    }
}
echo A::AA;     //常量的访问。
echo '<br>';
$d = new D;
$d->ctest('参数');
 
 
//接口可以单继承,多实现。
class E{
    public function etest(){}
}
class F extends E implements A,B,C{ //extends 与 implements 顺序不能写反
    public function atest(){}
    public function btest(){}
    public function ctest($argument){}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水月情缘雪飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值