zoukankan      html  css  js  c++  java
  • 《深入PHP:面向对象、模式与实践》(一)

    第1章  PHP:设计与管理

    本章主要介绍了本书有哪些内容。

    第2章  PHP与对象

    本章总结了PHP面向对象特性的发展过程,逐步介绍对象的概念。

    PHP/FI:支持变量、关联数组和函数。没有对象。

    PHP3:加入对类的支持,但不能访问父类中被覆盖的方法。

    PHP4:可以在子类中覆盖和访问父类的方法。对象在PHP脚本的传递依然会创建副本,但可以强制按引用传递(对象前面加&)。

    PHP5:明确支持对象和面向对象程序设计。默认按引用的方式传递对象。拥有更多扩展和增强对PHP对象的支持,比如命名空间、私有和保护类型的方法及属性、异常等。

    第3章  对象基础

    本章主要介绍PHP的核心面向对象特性。

    3.1  类和对象

    本节目标,理解类和对象的关系。

    3.1.1  编写第一个类

    类是生成对象的代码模板。

    使用 class 关键字和类名来声明类。类名是任意数字和字母的组合,不能以数字开头。和一个类关联的代码必须用大括号括起来。

    class ShopProduct {
        // 类体
    }

    3.1.2  第一个对象

    对象是根据类中定义的模板所构造的数据,是类的实例。使用 new 操作符来生成类对象。

    $product1 = new ShopProduct();
    $product2 = new ShopProduct();

    同一个类的对象是同一类型的不同实例。

    3.2  设置类中的属性

    类的属性也被称为成员变量,在声明和赋值前加一个代表可见性的关键字(public、protected 或 private)。

    在PHP4中,所有的属性都用 var 关键字声明,其效果和使用等价于 public 。

    class ShopProduct {
        // 类体
        public $title = "Apple";
    }

    访问成员变量:使用 -> 字符来连接对象变量和属性名。

    $product1 = new ShopProduct();
    echo $product1->title;    // 输出"Apple"

     作用域为 public 的属性既可以被读取,也可以被赋值。可以动态地设置属性,但不推荐这种做法。

    3.3  使用方法

    属性让对象存储数据,方法让对象执行任务。

    方法的声明:修饰词 + function关键字 + 方法名 + (),并且必须在类中声明。

    如果在方法声明中省略了可见性关键字,那么方法被隐性声明为 public。

    在PHP4中,方法的声明不能增加可见性关键字,否则程序报错。PHP4中所有的方法都是 public 型。

    方法的调用:大部分情况下使用 -> 连接对象变量和方法名来调用方法。

    $this伪变量 把类指向一个对象实例。

    创建构造方法

    创建对象时,构造方法会被自动调用。

    在 PHP5 之前的版本,构造方法使用和所在类相同的名字。在 PHP5 中,构造方法被命名为__construct(),但之前的命名方式依然有效。

     可预测性是面向对象编程的重要部分。

    3.4  参数和类型

     在 PHP 中,定义方法和函数不需要指定参数的数据类型。这既是一种便利,也是一种麻烦。

    3.4.1  基本类型

    PHP是一种弱类型语言,声明变量时不需要指定为特定的数据类型。但是,每个变量值都是一种数据类型。

    基本数据类型:一个例子

    该例子展示了一个数据类型相关的问题:类方法希望一个参数是布尔型,传过来的字符串 "false" 被解析为 true,从而导致类方法进行错误的处理。

    处理数据类型问题时,一定要考虑数据类型处理,需要在检测类型、转换类型和良好清晰的文档之间平衡。

    在面向对象开发中,“专注特定任务,忽略上下文”是一个重要的设计原则。

    3.4.2  获得提示:对象类型

    参数变量可以包含任何基本类型的数据,也可以包含任何类型的对象。

    在方法定义中,如果其参数接受一个对象,那么应该在该参数前面增加类型提示,也就是将类名放在方法参数前面。

    方法参数的类型提示不能用于某种基本数据类型,比如字符串和整型,但可以强制使用数组作为参数,这被称为数组提示。

    3.5  继承

     继承是从一个基类得到一个或多个派生类的机制。子类可以增加父类之外的新功能。

    3.5.1  继承问题

    书中举例说明ShopProduct类中的CD和图书这两部分会产生冗余的属性和方法,但是分别创建CD和图书这两个类又会造成代码重复。通过继承,把CD和图书当成单独的类,又能使用父类公共的属性和方法,同时允许每个类处理不同的方法调用。

    3.5.2  使用继承

     创建继承树的第一步是找到现有基类元素中不适合放在一起,或者不需要进行特殊处理的类方法。

    使用 extends 关键字来声明子类。子类默认继承父类所有的 public 和 protected 方法或属性(不能继承 private 方法或属性)。

    理解继承的一种方式是“搜索”。对属性或者方法的访问,如果没有在当前子类中找到,就会查找父类中的默认实现。

    1.  构造方法和属性

    引用一个类而不是对象的方法,使用 :: 而不是 ->,例如 parent::__construct()。

    子类实现自己的构造方法时,先调用父类的构造方法,再设置自己的属性,使得父类不知道子类的信息,让每个子类只处理自己的数据。

    2.  调用被覆写的方法

    parent关键字可以在任何覆写父类方法的方法中使用。

    覆写一个父类的方法时,应该先调用父类的方法,再继续写其他的扩展功能。

    3.5.3  public、protected、private:管理类的访问

     类中的元素可以被声明为 public、protected 或 private。

    • 在任何地方都可以访问 public 属性或方法。
    • 可以在当前类或子类中访问 protected 属性或方法,其他外部代码无权访问。
    • 只能在当前类中访问 private 属性或方法。

    一般来说,最好将类属性初始化为 private 或 protected,然后在需要的时候再放松限制条件。有些类方法如果只为类中其他方法提供本地功能,与类外部的代码没有联系,应该将其设置为 private 或 protected。

    1.  访问方法

     当客户端程序员需要使用类中的属性值时,比较好的做法是不要允许直接访问属性,而是提供访问方法来取得需要的值。访问方法还可以设置属性的可见性(protected或private),来阻止程序员直接操作属性。

    2.  ShopProduct类

    本小节改进了ShopProduct类及其子类,所有的属性被设置为 private 或 protected,所有的方法被设置为 public。

  • 相关阅读:
    Leetcode 1711. 大餐计数(桶)
    macOS下安装powerline-status失败(报错Could not install packages due to an EnvironmentError)
    macOS下安装oh my zsh失败(报错Connection refused)
    Chapter 10 Operator Overloading
    牛客IOI周赛26-普及组 B. 子序列(int128)
    关于状压DP中子集状态的枚举
    2021蓝桥杯省赛第一场C/C++A组 试题E:回路计数(状压DP)
    AcWing 2879. 画中漂流(简单DP)
    Leetcode 525. 连续数组(前缀和性质/map)
    牛客小白月赛34 B. dd爱探险(状压DP)
  • 原文地址:https://www.cnblogs.com/afee666/p/6846322.html
Copyright © 2011-2022 走看看