前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PHP面向对象基础总结

PHP面向对象基础总结

作者头像
用户7657330
发布于 2020-08-14 07:17:40
发布于 2020-08-14 07:17:40
1.5K00
代码可运行
举报
文章被收录于专栏:程序生涯程序生涯
运行总次数:0
代码可运行

近来参加了几场PHP工程师的面试,但是笔试题答得都不理想,回来总结了一下失败的原因,是没看PHP手册。几家公司的PHP基础面试题都可以在PHP手册上找到。哎,现在才知道最好的面试宝典是PHP手册。

下面是一些PHP面向对象基础知识的摘录,摘录内容来自PHP5.1手册。

1.类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。

2.属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是

在编译阶段之后在运行阶段运算出的常数。

3.在类的成员方法里面,可以通过$this->property(property是属性名字)这种方式来访问类的属性、 方法,但是

要访问类的静态属性或者在静态方法里面却不能使用,而是使用self::$property。

4.在类的非静态方法里面可以使用伪变量$this,这个伪变量是调用该方法的实例化对象引用

5.常量的值必须是一个定值,不允许修改,且不能是变量,类属性或其它操作(如函数调用)的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

class MyClass

{

    const constant = 'constant value';

    function showConstant() {

        echo  self::constant . "\n";

    }

}

echo MyClass::constant . "\n";

$n=new MyClass();

$n->showConstant();

?>

6.构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中

调用 parent::__construct()。

7.析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用

parent::__destruct()。

析构函数在脚本关闭时调用,此时所有的头信息已经发出。

试图在析构函数中抛出一个异常会导致致命错误。

8.当扩展一个类,子类就会继承父类的所有公有和保护方法。但是子类的方法会覆盖父类的方法。

9.范围解析操作符(::),可以用于访问静态成员、方法和常量

当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。

self 和 parent这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。

10.当一个子类覆盖其父类中的方法时,PHP 不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止。这

种机制也作用于 构造函数和析构函数、重载 及 魔术 函数。

11.静态变量和方法

声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法

除外)。

由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。

静态属性不可以由对象通过->操作符来访问。

用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。

就像其它所有的PHP静态变量一样,静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可

以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。

12.如果没有指定“可见性”,属性和方法默认为public。

13.抽象类

抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。抽象类中 至少要包含一个抽象方法。如果

类方法被声明为抽象的,那么其中就不能包括具体的功能实现。

继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;另外,这些方法的可见性 必须和抽象类中一样(

或者更为宽松)。如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected

或者public,而不 能定义为private。

应用示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class AbstractClass

{

 // 强制要求子类定义这些方法

    abstract protected function getValue();

    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)

    public function printOut() {

        print $this->getValue() . "\n";

    }

}

class ConcreteClass1 extends AbstractClass

{

    protected function getValue() {

        return "ConcreteClass1";

    }

    public function prefixValue($prefix) {

        return "{$prefix}ConcreteClass1";

    }

}

14.使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

我们可以通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是public,这是接口的特性。

要实现一个接口,可以使用implements操作符。类中必须实现接口中定义的所有方法,否则 会报一个fatal错误。

如果要实现多个接口,可以用逗号来分隔多个接口的名称。

实现多个接口时,接口中的方法不能有重名。

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

接口中也可以定义常量。接口常量和类常量的使用完全相同。 它们都是定值,不能被子类或子接口修改。

应用示例:

//接口定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface iTemplate

{

    public function setVariable($name, $var);

    public function getHtml($template);

}

//使用接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Template implements iTemplate

{

    private $vars = array();

  

    public function setVariable($name, $var)

    {

        $this->vars[$name] = $var;

    }

  

    public function getHtml($template)

    {

        foreach($this->vars as $name => $value) {

            $template = str_replace('{' . $name . '}', $value, $template);

        }



        return $template;

    }

}

15.PHP5提供了一种迭代(iteration)对象的功能,就像使用数组那样,可以通过foreach来遍历对象中的属性。

默认情况下,在外部迭代只能得到外部可见的属性的值。

应用示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

class MyClass

{

    public $var1 = 'value 1';

    public $var2 = 'value 2';

    public $var3 = 'value 3';

    protected $protected = 'protected var';

    private   $private   = 'private var';

    function iterateVisible() {

       echo "MyClass::iterateVisible:\n";

       foreach($this as $key => $value) {

           print "$key => $value\n";

       }

    }

}

$class = new MyClass();

foreach($class as $key => $value) {

    print "$key => $value\n";

}

echo "\n";



$class->iterateVisible();

?>

16.设计模式

工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂

方法的参数是 你要生成的对象对应的类名称。

单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个

对象后,该对象可以被其它众多对象所使用。

应用示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

class Example

{

    // 保存类实例在此属性中

    private static $instance;

    

       // 构造方法声明为private,防止直接创建对象

    private function __construct() 

    {

        echo 'I am constructed';

    }

    // singleton 方法

    public static function singleton() 

    {

        if (!isset(self::$instance)) {

            $c = __CLASS__;

            self::$instance = new $c;

        }

        return self::$instance;

    }

    

    // Example类中的普通方法

    public function bark()

    {

        echo 'Woof!';

    }

    // 阻止用户复制对象实例

    public function __clone()

    {

        trigger_error('Clone is not allowed.', E_USER_ERROR);

    }

}

?>

这样我们可以得到一个独一无二的Example类的对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

// 这个写法会出错,因为构造方法被声明为private

$test = new Example;

// 下面将得到Example类的单例对象

$test = Example::singleton();

$test->bark();

// 复制对象将导致一个E_USER_ERROR.

$test_clone = clone $test;

?>

17.PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被

声明为final,则不能被继承。

18.对象复制可以通过clone关键字来完成(如果对象中存在__clone()方法,会先被调用)。对象中的 __clone()

方法不能直接调用。

copy_of_object = clone object;

当对象被复制后,PHP5会对对象的所有属性执行一个“浅复制”(shallow copy)。所有的属性中的引用 仍然不

变,指向原来的变量。如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调

用, 可用于修改属性的值(如果有必要的话)。

19.对象比较

当使用对比操作符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象

是同一个类的实例,那么这两个对象变量相等。

而如果使用全等操作符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。

20.对象和引用

php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。

只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另

外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正

内容

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
深入理解Java包装类与泛型的应用
在Java中,装箱(boxing)是指将基本数据类型(如int, char, double等)转换为对应的包装类对象(如Integer, Character, Double等)的过程。相反,拆箱(unboxing)是指将包装类对象转换回基本数据类型的过程。
学无止尽5
2024/11/29
1730
深入理解Java包装类与泛型的应用
Java5新特性及使用
Java语言引入泛型的好处是安全简单。可以将运行时错误提前到编译时错误。在Java5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的任意化,任意化带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
Abalone
2022/07/14
1.4K0
Effective Java通俗理解(上)
  这篇博客是Java经典书籍《Effective Java(第二版)》的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约会持续1个月左右。 第1条:考虑用静态工厂方法代替构造器   通常情况下我们会利用类的构造器对其进行实例化,这似乎毫无疑问。但“静态工厂方法”也需要引起我们的高度注意。   什么是“静态工厂方法”?这不同于设计模式中的工厂方法,我们可以理解它为“在一个类中用一个静态方法来返回这个类的实例”,例如: public st
用户1148394
2018/01/12
1.5K0
Effective Java通俗理解(上)
java基础之泛型
泛型 术语 "?"通配符 通配符的扩展 自定义泛型方法 "擦除"实例 类型参数的类型推断 自定义泛型类 泛型方法和泛型类的比较 泛型和反射 通过反射获得泛型的实际类型参数 本文对泛型的基本
xiangzhihong
2018/02/01
1.1K0
java基础之泛型
3分钟快速阅读-《Effective Java》(一)
简介 Effective Java这本书针对的是有经验的程序员,本书共计78个条目,目的是告诉大家如何进行更加有效的编程 1.考虑用静态工厂方法代替构造器 静态工厂方法的优点 1.1 静态工厂方法有对应方法名称,构造器则没有.所以使用静态工厂方法能够更加直接的表达想要实例化的对象 1.2 静态工厂方法不用每次都创建出一个新的对象 1.3 静态工厂方法可以返回父类对象或者接口对象 1.5 静态工厂方法可以使用泛型来作为返回的参数 静态工厂方法的缺点 1.1 如果不含有公有的或者受保护的构造
cwl_java
2019/10/26
3910
Java知识点总结之Java泛型
作者:苏生 链接: https://segmentfault.com/a/1190000014824002 泛型 泛型就是参数化类型 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛型归根到底就是“模版” 优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。 泛型主要使用在集合中 import java.util.ArrayList; import java.util.List; public class Demo01 { // 不使用泛型,存取数据麻烦
用户1257393
2018/07/30
5710
不了解这12个语法糖,别说你会Java!
本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理
java架构师
2019/05/17
8100
effective Java 创建和销毁对象篇
小伙伴们好呀,我是 小羊 ,今天来和大家分享下 《Effective Java》这本书的 第2章 —— 创建和销毁对象 。
Java4ye
2024/02/14
2890
effective Java 创建和销毁对象篇
第08天Java泛型机制
如果没有泛型,要实现不同类型的加法,每种类型都需要重载一个 add 方法;通过泛型,我们可以复用为一个方法:
程序员Leo
2023/09/09
1930
第08天Java泛型机制
Java基础系列二:Java泛型
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
说故事的五公子
2020/04/13
5500
java 泛型全解 - 绝对最详细
对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。
程序狗
2021/12/20
4.1K0
Java 类集初探
List属于接口,如果想使用接口进行操作,就必须存在子类;使用 ArrayList 子类实现(和Vector子类)
Mirror王宇阳
2020/11/10
5890
java基础
分析: 这里的 nums1 = nums2 不是将 nums2 的值赋值给 nums1 ,而是将 nums2指向了nums1的对象,或把nums2的内存地址指向给nums1,所以nums1的值就为nums2的值 .
shaoshaossm
2022/12/26
5850
java基础
《Effective Java》读书笔记(一)之创建和销毁对象
最近在研读《Effective Java》一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记。 郑重声明: 由于是《Effective Java》一书的笔记,所以大部分内容基本来自此书,还有一小部分是自己的理解。
老马的编程之旅
2022/06/22
3710
Java中的泛型(很细)
非常好,让我们深入探讨Java中的泛型这个重要主题。我将按照之前提供的框架,为您创作一篇全面而专业的技术博客文章。
程序员朱永胜
2024/07/18
1940
Java中的泛型(很细)
Java8 通关攻略
Java8 特别强大的是Lambda 表达式和Stream,通过它两新增和增强了很多包
乔戈里
2020/02/14
1.2K0
Java8 通关攻略
Java 泛型:理解和应用
这就是泛型的概念,是 Java 后期的重大变化之一。泛型实现了参数化类型,可以适用于多种类型。泛型为 Java 的动态类型机制提供很好的补充,但是 Java 的泛型本质上是一种高级语法糖,也存在类型擦除导致的信息丢失等多种缺点,我们可以在本篇文章中深度探讨和分析。
phoenix.xiao
2023/08/28
2680
Java 泛型:理解和应用
语法糖--JAVA成长之路
前面提到过,从Java 7 开始,Java语言中的语法糖在逐渐丰富,其中一个比较重要的就是Java 7中switch开始支持String。
后端码匠
2020/08/24
6930
深入理解 Java 泛型
泛型要求在声明时指定实际数据类型,Java 编译器在编译时会对泛型代码做强类型检查,并在代码违反类型安全时发出告警。早发现,早治理,把隐患扼杀于摇篮,在编译时发现并修复错误所付出的代价远比在运行时小。
静默虚空
2022/03/23
4290
深入理解 Java 泛型
Java进阶-集合(3)与泛型
这次介绍集合中的Iterator迭代器,以及泛型。简单来说,泛型对集合的元素类型进行了限制,使用泛型可以在编译时检查类型安全,提高代码的重用率。内容如下
reload
2024/03/01
3190
Java进阶-集合(3)与泛型
相关推荐
深入理解Java包装类与泛型的应用
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档