面向对象 笔记

版权声明:原创文章转载请注明来源 https://blog.csdn.net/LQZ8888/article/details/90210576

单例模式封装一个操作类
三私一共:
私有的静态属性用来存储本类实例化的对象
私有的构造方法(目的防止类的外部实例化该类)
私有的克隆方法(目的是防止该类实例化的对象被克隆复制)
公共权限静态的方法(目的在类的外部不实例化该类的情况下获取该类的实例化对象)
该方法中重点要清楚,要判断该类私有静态属性是否保存了该类的实例化对象,未保存则new self实例化,最后返回该类实例化的对象。

面向对象的三大特征:封装、继承、多态
封装:我们可以简单理解为类class 属性和方法的权限修饰。
public private protected 

继承:
父类公共的和受保护的类成员都可以在子类中被调用。

多态:
多 态(Polymorphism)按字面上意思理解就是“多种形状”。可以理解为多种表现形式,也即“一个对外接口,多个内部实现方法”。
在面向对象的理论 中,多态性的一般定义为:同一个操作作用于不同的类的实例,将产生不同的执行结果。
也即不同类的对象收到相同的消息时,将得到不同的结果

trait
用来解决Php单继承   为了让代码有更好的复用性 增加的代码块功能
形式更class一致
同样也支持 在体内定义静态属性和静态方法
同一个类中可以引用多个trait
trait 之间也可以相互引用
本类的方法覆盖trait,trait覆盖父类方式。

可变变量:一个可变变量获取了一个普通变量的值作为这个可变变量的变量名

#####################################################################################

抽象类、抽象方法

抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
一句话概括:抽象方法就是没有方法体的方法且使用abstract关键词修饰的方法(抽象类中,接口)。

使用abstract关键字修改的class,我们统称为抽象类。
如果一个类中有一个抽象方法那么这个类就必须声明为抽象类。


所有的抽象类都不能被实例化,抽象类就相当于是半成品,不能出厂销售或使用。
继承一个抽象类的时候,子类必须实现父类中的所有抽象方法;
另外,这些方法的访问控制必须和父类中一样(或者更为宽松)

修饰类的关键词:abstract  final 
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承

接口:
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的(没有方法体的方法)。
接口中定义的所有方法都必须是公有,这是接口的特性
接口其实是一种规范,在结构中规定一些方法,但不用实现,目的是想让一个类来继承并实现它,严格来说不是继承,
就是一个类来实现它。接口中除了方法声明外,还可以有常量

要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。
类可以实现多个接口,用逗号来分隔多个接口的名称

接口也可以继承,通过使用 extends 操作符。

接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。

abstract class 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。

  接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。
  而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。
  
  抽象类是一种特殊的类,接口是一种特殊的抽象类,多态就要使用到抽象类或接口!


魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),
 __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()
 
 https://www.php.net/manual/zh/language.oop5.magic.php
 
 
 命名空间:
 命名空间(namespace)是在PHP 5.3中加入的
 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在操作系统中目录用来将相关文件分组,对于目录中的文件来说,目录就扮演了命名空间的角色
 命名空间名称的命名规则:大驼峰 例:namespace MyProject;

 
 PHP 命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。/2
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
你也可以在同一个文件中定义不同的命名空间代码,但实际项目开发过程中很少会在同一个文件声明多个命名空间的。
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
 
 与目录和文件的关系很像,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义。
 namespace MyProject\Sub\Level;  //声明分层次的单个命名空间
 分层方式定义的命名空间则是子命名空间
 
 是文件中使用use操作符导入/使用别名 引入命名空间,为了简化操作,PHP还支持在一行中使用多个use语句(多个命名空间使用逗号分隔)。
 实例:use My\Full\Classname as Another, My\Full\NSname;
 
 
 如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。
 常量__NAMESPACE__的值是包含当前命名空间名称的字符串。
 
 (导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响)


 自动加载:
  在一个PHP文件中当使用到某个类文件时可以隐式地把文件引入到当前PHP文件中这种机制就称为自动加载(不需要在文件头上方写出include加载长长的列表)。
  自动加载机制可以使得 PHP 程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件 include 进来。
 
  spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载
  
  实例:尝试在当前中分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类。
  <?php
    spl_autoload_register(function ($class_name) {
    require_once $class_name . '.php';
    });

    $obj  = new MyClass1();
    $obj2 = new MyClass2();
    
    省去了显式的include或require导入列表:
    require'MyClass1.php';
    require'MyClass2.php ';
 
 
 注意:spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。
 因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。
 
 ################################################################
 先预习异常错误信息处理、SPL 数据结构、迭代器、数组式访问ArrayAccess  我们用一到两节课的时间把这些内容讲完。
 
  
错误信息:

PHP中什么是错误:
  属于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,
甚至无法运行的情况。warning、notice都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。


异常处理:
PHP中什么是异常:
  程序在运行中出现不符合预期的情况,允许发生但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,
但仍然会出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。

PHP错误信息相关:
error_reporting()  设置错误级别
display_errors  On表示开启状态下,若出现错误,则报错,出现错误提示。 Off 表示关闭状态下,若出现错误,则提示:服务器错误。但是不会出现错误提示 
log_errors  把错误信息记录在日志里。
当这个log_errors设置为On,那么必须指定error_log文件,如果没指定或者指定的文件没有权限写入,那么照样会输 出到正常的输出渠道
,那么也就使得display_errors 这个指定的Off失效,错误信息还是打印

PHP错误级别:
E_ERROR (integer)    致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。
E_WARNING (integer)    运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。
E_PARSE (integer)    编译时语法解析错误。解析错误仅仅由分析器产生。     
E_NOTICE (integer)    运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。
E_ALL (integer)    E_STRICT出外的所有错误和警告信息。
其它错误信息参考:https://php.net/manual/zh/errorfunc.constants.php
精简版:
 1     Fatal Error:致命错误(脚本终止运行)
 2         E_ERROR         // 致命的运行错误,错误无法恢复,暂停执行脚本
 3         E_CORE_ERROR    // PHP启动时初始化过程中的致命错误
 4         E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
 5         E_USER_ERROR    // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)
 6 
 7     Parse Error:编译时解析错误,语法错误(脚本终止运行)
 8         E_PARSE  //编译时的语法解析错误
 9 
10     Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
11         E_WARNING         // 运行时警告 (非致命错误)。
12         E_CORE_WARNING    // PHP初始化启动过程中发生的警告 (非致命错误) 。
13         E_COMPILE_WARNING // 编译警告
14         E_USER_WARNING    // 用户产生的警告信息
15 
16     Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
17         E_NOTICE      // 运行时通知。表示脚本遇到可能会表现为错误的情况.
18         E_USER_NOTICE // 用户产生的通知信息。
有5类是产生ERROR级别的错误,这种错误直接导致PHP程序退出。
 ERROR = E_ERROR | E_CORE_ERROR |  E_COMPILE_ERROR | E_USER_ERROR | E_PARSE

try{}体内写代码块,有异常会往外抛出异常
catch(){}会抓取异常

try{}catch(){}
try{}catch(){}catch(){}
try{}catch(){}finally{}
finally必须保证一定被执行。
如果try catch都有return,按照正常执行,然后执行finally的逻辑,再返回对应的try 或者catch里执行return。
如果try catch finally都有return,执行完finally的逻辑后,会调用finally的return。
 
 
SPL数据结构:SPL 提供了一套标准的数据结构。它们按底层实现进行分组, 通常定义了它们的一般应用领域
 双向链表
 双链表 (DLL) 是一个链接到两个方向的节点列表
 
 堆
 堆是遵循堆属性的树状结构: 每个节点都大于或等于其子级, 使用对堆全局的已实现的比较方法进行比较
 
 数组
 数组是以连续方式存储数据的结构, 可通过索引进行访问。不要将它们与 php 数组混淆: php 数组实际上是按照有序的列表实现的。
 
 映射
 映射是一个数据拥有键值对。PHP 数组可以被看作是从整数/字符串到值的映射。SPL 提供了从对象到数据的映射。此映射也可用作对象集。
 
 
 Iterator 迭代器

迭代器:能够用来遍历访问聚合对象内部的部分或全部元素的设计成为迭代器
foreach就是一个迭代器
 
 
 数组式访问ArrayAccess
 什么是数组式访问ArrayAccess?
 提供像访问数组一样访问对象的能力的接口。
  

猜你喜欢

转载自blog.csdn.net/LQZ8888/article/details/90210576
今日推荐