多态,方法修饰符,接口,常量,加载类

2019年01月10日 18:22:47阅读数:626博客 / forwt的博客 / PHP
  • 多态

    • oop面向对象编程三大特性:封装,继承,多态

    • 多态分为:重写,重载(php不支持)

      • 重写:子类重写了父类的同名方法

      • 注意:子类中覆盖的方法不能比父类的方法访问权限更加严格

  • 方法修饰符

    • static (静态的)

      • 1-1

        • 1. 静态属性在加载类的时候分配空间,所以不需要实例化就可以直接访问

        • 2.访问静态成员语法:类名::静态成员 

        • 3.静态成员在内存只有就一份,为所有的实例公共。

        • 4. 静态成员不能访问普通成员,只能访问静态成员。因为静态成员被创建的时候可能还没有任何实例被实例化

        • 5.static修饰属性成为静态属性,static修饰方法成为静态方法

      • 1-2 self

        • self表示当前类的名字

        • 1.png

        • 注意:非静态方法被self::调用,自动转成静态方法 不能调用普通属性(在类没有实例化之前 普通属性没有分配空间)

        • 2.png

      • 1-3 静态成员可以被继承

      • 1-4  确定当前对象(静态延时绑定)

        • 【static::静态成员】称为延时绑定,static表示的是一个类,具体表示什么类在运行时确定,表示的是当前对象所在的类

    • final(最终的)

      • final修饰的类不能被继承

      • final修饰的方法不能重写

    • abstruct(抽象的)

      • abstruct修饰的方法叫抽象方法,abstruct修饰的类叫抽象类

      • 如果只有方法的声明而没有方法的实现成为抽象方法

      • 如果一个类中有一个方法是抽象方法,那么这个类就是抽象类

      •  抽象类不允许实例化,必须在子类中重新实现才能实例化

      • 抽象类的作用:

        • 定义统一的方法名称

        • 防止实例化

  • 接口(interface)

    •  如果一个类中所有的方法全都是抽象方法,那么这个类就可以声明成接口

    • 接口是一个特殊的抽象类

    •  接口中的抽象方法只能是public的,默认也是public权限

    • 通过implements类实现接口

    •  不能通过final和abstract修饰接口中的抽象方法

    • 类不允许多重继承,接口允许多重实现

    • 先继承类,后实现接口

      •  继承类同时实现接口

      • 4.png

  • 类常量

    • 补充:类(接口)中可以放属性、方法、常量。

    • 类常量用const定义

  • 父类可以指向子类的引用

  • 类的自动加载

    • 在项目中

    •  一个文件中存放一个类

    • 文件名与类名同名

    • 以.class.php结尾

    • 当页面执行的时候,通过PHP核心程序(Zend Engine)判断用户脚本需要哪个类。如果没有找到,会自动的调用__autoload()函数,并且会将缺少的类名传递给__autoload()函数,我们只需要在__autoload函数中加载缺少的类即可。

    • 手动加载类

      • 1.9.1	手动加载类
        require 'Goods.class.php';
        require 'Books.class.php';
        require 'Phone.class.php';
        $book=new Books();
        $phone=new Phone();
        $book->setName('PHP入门与精通');
        $phone->setName('诺基亚2100');
        $book->getName();
        $phone->getName();
    • 自动加载类

      • 类文件存放在同一个目录下

      • 1.png

    • 将类的地址映射到数组中加载

      • 类文件存放的地址不规则

      • function __autoload($class_name) {
        	$map=array(
        		'Goods'	=>	'./aa/Goods.class.php',
        		'Books'	=>	'./bb/Books.class.php',
        		'Phone'	=>	'./cc/Phone.class.php'
        	);
        	require $map[$class_name];
        }
    • 利用命名规则加载类

      • 将同一类型的类文件放在同一个目录下。

      • $book=new BooksLib();
        $phone=new PhoneLib();
        $book->setName('PHP入门与精通');
        $phone->setName('诺基亚2100');
        $book->getName();
        $phone->getName();
        
        //通过命名规则加载类
        function __autoload($class_name) {
        	if(substr($class_name,-3)=='Lib'){
        		require "./Lib/{$class_name}.class.php";
        	}
        }

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    forwt的博客
    博文
    3
    粉丝
    0
    评论
    0
    访问量
    2193
    积分:0
    P豆:161