PHP中类与对象(一)

参考文档:http://php.net/manual/zh/language.oop5.php

1、new的几种方式

$obj = new ClassName();
$obj = new ClassName;
$obj = new $obj;

$className = 'Foo';
$obj = new $className;

2、new self、new static、new parent的区别

等待补充

3、extends – 继承

  • PHP不支持多重继承,一个类只能继承一个基类。
  • 被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。
  • 当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。

4、::class

自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。

5、属性、方法、对象的访问控制及可见性

属性初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值。

Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。

6、自动加载

9、抽象类

10、接口类 - interface

11、trait – 特征类

  • trait类和继承相比,继承(extends)是纵向扩展,trait是横向扩展(水平扩展);
  • 特征类使用use,多个trait类使用,分隔
  • 优先顺序是来自当前类的成员 > trait 的方法 > 被继承的方法。
  • 使用insteadof 、as来解决使用多个特征类时,存在的冲突方法。例如: B::smallTalk insteadof A;B::bigTalk as talk;
  • 使用 as 语法还可以用来调整方法的访问控制,例如:sayHello as private myPrivateHello;
  • 了对使用的类施加强制要求,trait 支持抽象方法的使用
  • Traits 可以被静态成员静态方法定义,如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。

12、匿名类 - 非常有用

13、overloading – 重载

  • PHP的重载使用魔术方法来实现,魔术方法包括__set、__get、__unset、__isset、__call、__callstatic。
  • 当访问不可见的、未定义的属性和方法,重载的魔术方法会被调用。
  • 所有的重载魔术方法都必须被声明为 public这些魔术方法的参数都不能通过引用传递

14、魔术方法

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()

  • __sleep()和__wakeup(),分别在使用serialize和unserialize时调用。
  • __toString():当类被当成字符串使用时调用,例如:echo $obj
  • __invoke():当尝试以调用函数的方式调用一个对象时调用。即把对象当成函数处理,$obj = new CallableClass;  $obj(5);
  • __debugInfo():在打印输出时被调用,例如var_dump();
  • __clone():对象复制时使用.

15、后期静态绑定

后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。

16、关键字final

  • final仅能定义类和方法,不能定义属性。final定义的方法不能被子类覆盖,final定义的类不能被继承。

17、对象的比较

  • ==成立的条件:a和b两个对象具有相同的属性和属性值,而且两个对象是同一个类的实例。
  • ===成立的条件:a和b两个对象变量一定要指向某个类的同一个实例(同一个对象)

18、类型约束

  • 类型可以指定为对象(在函数原型里面指定类的名字)、接口、数组、callable,NULL值,不能使用int、string。
  • 类型的约束除了使用在类的方法中,同样可以使用在普通的函数中。

19、对象和引用

20、对象的序列化(serialize)和反序列化(unserialize)

  • 对象的序列化仅保存类属性。
  • 对象反序列化时,必须确保有该对象的类定义。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>