1、类的自动加载: spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载,这样可以避免include一大堆文件。

比如你有一个(甚至很多个)需要引用的类文件Example.php,它是这样子的

<?php
class Example{
public function __construct() {
echo "I am zhylioooo";
}
}

你还有一个父文件,或者父类,或者说是公共文件,总之是你必须要用到的文件,它是这样子的

<?php
function getClass($class) {
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('getClass');
//实例化一个本文件没有的类
new Example(); //当你在这个公共文件上面或者包含它的文件下面实例化不在同一个文件上的类时,就会自动查找并把那个类文件加载进来,就可以实例化了

当然,这只是最简单的例子,但是当需要引用的类文件比较多的时候,就很能体现出spl_autoload_register()的价值与灵活性了。

2、代码的复用:trait定义和class相似,但是无法实例化自身,通常用use来实现代码复用,相当于把trait的内容复制到use的地方,use多个trait类时用逗号隔开

<?php
trait A{
function say(){
echo "hello";
}
}
class B{
use A;
}
$obj=new B();
$obj->say();

从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

<?php
trait A{
function say(){
echo "hello";
}
function listen(){
echo "Wow!";
}
}
class B{
function say(){
echo "zhylioooo";
}
}
class C extends B{
use A;
function listen(){
echo "boom!";
}
}
$obj=new C();
$obj->say(); //输出"hello",trait类A覆盖了父类B的相同方法
$obj->listen(); //输出"boom",当前类C覆盖了trait类A的相同方法

3、匿名类的创建和使用:PHP 7 开始支持匿名类。 匿名类可以创建一次性的简单对象,可以传递参数到匿名类的构造器,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用 trait,

<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
/*
*以上代码会输出:
*object(class@anonymous)#1 (1) {
*["Command line code0x104c5b612":"class@anonymous":private]=>
*int(10)
* }
*/

4、重载overloading:当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用,所有的重载方法都必须被声明为 public,这些魔术方法的参数都不能通过引用传递

属性重载

<?php
class A{
private $name="zhylioooo";
private $data=array(); //保存被重载的数据
//在给不可访问属性赋值时,__set() 会被调用
public function __set($name, $value) {
$this->data[$name]=$value;
}
//读取不可访问属性的值时,__get() 会被调用
public function __get($name) {
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}else{
return "Undefined property ".$name;
}
}
//当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用
public function __isset($name) {
return isset($this->data[$name]);
}
//当对不可访问属性调用 unset() 时,__unset() 会被调用
public function __unset($name){
echo $name."has unset.";
unset($this->data[$name]);
}
//调用存在的属性
public function getName(){
return $this->name;
}
} $obj=new A();
echo $obj->getName(); //输出"zhylioooo"
echo $obj->age; //输出"Undefined property age"
var_dump(isset($obj->age)); //输出 ...03.php:34:boolean false
unset($obj->age); //输出"age has unset"
$obj->age=24;
echo $obj->age; //输出24

方法重载

<?php
class A{
private function say1(){
echo "hello";
}
private static function say2(){
echo "world";
}
//在对象中调用一个不可访问方法时,__call() 会被调用
//$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数
public function __call($name, $arguments) {
echo "call the ".$name.":";
$this->say1();
}
public static function __callStatic($name, $arguments){
echo "call the static method ".$name;
self::say2();
}
}
$obj=new A();
$obj->say1(); //输出call the say1:hello
A::say2(); //输出call the static method say2world

5、魔术方法:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法,包括

  • __construct(),类的构造函数(类实例化时自动调用)
  • __destruct(),类的析构函数(销毁一个类之前调用)
  • __call(),在对象中调用一个不可访问方法时调用
  • __callStatic(),用静态方式中调用一个不可访问方法时调用
  • __get(),获得一个类的成员变量时调用
  • __set(),设置一个类的成员变量时调用
  • __isset(),当对不可访问属性调用isset()或empty()时调用
  • __unset(),当对不可访问属性调用unset()时被调用。
  • __sleep(),执行serialize()时,先会调用这个函数
  • __wakeup(),执行unserialize()时,先会调用这个函数
  • __toString(),类被当成字符串时的回应方法
  • __invoke(),调用函数的方式调用一个对象时的回应方法
  • __set_state(),调用var_export()导出类时,此静态方法会被调用(var_export和var_dump类似)
  • __clone(),当对象复制完成时调用
  • __autoload(),尝试加载未定义的类(建议使用spl_autoload_register())
  • __debugInfo(),打印所需调试信息

其中__sleep和__wakeup

<?php
//serialize()函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,则该方法会优先被调用,然后才执行序列化操作。
//unserialize()会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,再进行反序列化操作。
//序列化函数serialize()的作用是把不方便存储和传递的php变量序列化为可存储的字符串,而反序列化函数unserialize()则是把相应字符串反序列化为php变量。
//serialize()可处理除了 resource 之外的任何类型
$arr=array(1,2,3);
$data= serialize($arr);
var_dump($data); //输出..\03.php:6:string 'a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}' (length=30)
$new_arr= unserialize($data);
var_dump($new_arr);
/*输出C:\wamp64\www\test\03.php:8:
array (size=3)
0 => int 1
1 => int 2
2 => int 3
* */
<?php
class A{
private $name,$pswd;
public function __construct($name,$pswd) {
$this->name=$name;
$this->pswd=$pswd;
$this->login();
}
public function login(){
echo "hello ".$this->name."!your pswd is ".$this->pswd;
} public function __sleep() {
return array("name","pswd");
}
public function __wakeup() {
$this->login();
}
}
$obj=new A("zhylioooo","123456"); //输出hello zhylioooo!your pswd is 123456
$str=serialize($obj);
unserialize($str); //再次输出hello zhylioooo!your pswd is 123456
/*
*序列化操作对象时,__sleep()用于提交未提交的数据,即保持对象现场状态
*__wakeup()则是恢复现场
*/

6、  类与对象的几个重要函数和关键字

class_exists() 判断某个类是否存在
interface_exists() 判断接口是否存在
class_implements() 返回指定类实现的所有接口
class_parents() 返回指定类的父类
get_class() __CLASS__ 获取某个对象所处的类名
get_parent_class() 获取某个对象所属父类的类名
get_class_methods() 获取一个类所有方法,返回索引数组
get_class_vars() 获取一个类所有属性,下标为属性名
get_declared_classes() 获取所有声明过的类(包括系统类)
is_object() 判断是否对象
get_object_vars() 获得对象所有属性,返回数组,下标为属性名
property_exists() 判断对象中是否存在该属性
get_called_class() 获取当前主调类的类名(最初调用的类) this 是指向当前对象的指针(姑且用C里面的指针来看吧)
self 是指向当前类的指针
parent 是指向父类的指针
static 是指向最初调用的类

php之基础深入---类与对象篇的更多相关文章

  1. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

  2. ObjectiveC1基础代码——类和对象

    // //  main.m //  ObjectiveC1 // //  Created by scjy on 15/10/30. //  Copyright © 2015年 lizhipeng. A ...

  3. C++_基础_类和对象

    内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...

  4. J2SE基础:1.类和对象基础

    什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...

  5. java基础知识—类和对象

    1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...

  6. Java基础-3类和对象声明与创建

    一).在1和2中有粗略介绍过类和对象的概念,在这里简单回顾一下: 对象与类:一个实际或者虚拟的物体,这个物体既是我们的对象,这个物体呢又是属于一个分类,如动物类,人类 二).创建对象: 在创建对象的时 ...

  7. Java基础教程——类和对象

    视屏讲解:https://www.bilibili.com/video/av48272174 面向过程 VS 面向对象 面向过程:强调步骤. 面向对象:强调对象. 面向对象的特点就是:隐藏具体实现的细 ...

  8. C++_基础_类和对象3

    内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...

  9. C++_基础_类和对象2

    内容: (1)构造函数 (2)初始化列表及其必要性 (3)支持自定义类型转换的构造函数 (4)this指针 (5)const对象和成员函数 (6)析构函数 1.构造函数1.1 格式: class 类名 ...

随机推荐

  1. Lxc的cgroup技术

    你将学到什么 什么是cgroup 如何使用cgroup Cgroup简介 CGroup是Control Groups的缩写,是Linux内核提供的一种可以限制.记录.隔离进程组所使用的硬件资源的机制. ...

  2. [CentOS7] ssh免密登录 scp免密传输

    我们采用RSA非对称加密算法,原理: 如果,A要和B通讯,则: (1). A通过RSA算法生成公钥(.pub)和私钥(公钥用于加密,私钥用于解密) (2). B将A的公钥文件(.pub)内容加入到au ...

  3. SAS笔记(1) PDV与数据读入

    其实我是不喜欢SAS的.当然,我不喜欢她,并不代表她不好,实际上在某些应用场景下SAS是款很优秀的软件.我的数据分析之路始于R,品尝过R的灵活与简洁(不论是软件安装还是语法)后,再来学习SAS,的确提 ...

  4. lyd的旅行

    lyd的旅行 众所周知,lyd是一个人赢.他有很多很多的妹子.某天,他带着他的众多妹子进行了一次旅(dou)行(feng),由于lyd的车上妹子太多超重了,所以车速每秒最多只能改变d个单位,lyd在出 ...

  5. FoundToday for HK 技术支持

    FoundToday for HK 技术支持   技术支持网址:有问题或建议请留言. 邮箱地址: swvrwafet@zoho.com Program design & system cons ...

  6. Java中的生产者和消费者实例(多线程 等待唤醒机制)

    1.什么是等待唤醒 我们实现的效果 创建生产者和消费者  对服装进行生产  和售卖 实现生产一个就消费一个 来观察线程的各种状态 下面是用到的方法: wait()方法:让一个线程进行等待 另外一个线程 ...

  7. 怎么在Vue中使用Base64格式的背景

    问题发生于一次mock数据,生成了base64格式的东西,因为编码包在一个变量中,不知道怎么直接在 :style 中引入. 解答1:格式background-image: url(此处是我们mock生 ...

  8. Codeforces Round #363 (Div. 2) A

     Description There will be a launch of a new, powerful and unusual collider very soon, which located ...

  9. 09-----JS事件流的概念(重点)

    在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 时间的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以 ...

  10. Jetty项目解压目录设置

    Ubuntu14.04 没有在Jetty的根目录下建立work文件夹时,Jetty会默认将项目解压到/var/cache/jetty/data/下,如果在Jetty的根目录下建立work文件夹,jet ...