PHP 使用总结

自动类加载 (auto-load)

自动类加载说白了就是自动 include / require php 文件,这里以: Aliyun_Log_Client 为例说明。

如果想使用 Aliyun_Log_Client 这个类, 需要先 :

require_once('aliyun/Aliyun/Log/Client.php');

这里你不仅需要手动 require, 还需要知道 php 文件的相对位置。

但是如果实现了自动类加载呢, 你只需要

use Aliyun_Log_Client;

我们知道 PHP 执行的本质还是需要将依赖的 php 文件都加载在一起,那么自动类加载是如何做到的呢?

主要需要做两件事:

  1. spl_autoload_register 注册一个解析 class 名的函数
  2. 根据 class 名找到对应的 php 文件并调用 require

这里看 Aliyun_Log 是如何实现的:

Log_Autoload.php

<?php
/**
 * Copyright (C) Alibaba Cloud Computing
 * All rights reserved
 */

$version = '0.6.0';

function Aliyun_Log_PHP_Client_Autoload($className) {
    $classPath = explode('_', $className);
    if ($classPath[0] == 'Aliyun') {
        if(count($classPath)>4)
            $classPath = array_slice($classPath, 0, 4);
        $filePath = dirname(__FILE__) . '/' . implode('/', $classPath) . '.php';
        if (file_exists($filePath))
            require_once($filePath);
    }
}

spl_autoload_register('Aliyun_Log_PHP_Client_Autoload');

然后你需要在代码执行之前 require 这个文件。

懂得了这个,你就可以组织自己的代码结构,定义自己的命名习惯,并且可以很方便的给别人使用.

魔术方法 (magic method)

如: __get(), __set(). __isset, __unset, __call, __callstatic 这些方法,在实现框架代码时是很常见且常用的,知道什么时候这些魔术方法会被调用,以及它能用来做什么事情,对于一个 PHPer 来说很标配。以 __get(), __set() 来例:

<?php

class Object {
    public $data;
  
    public function __get($name)
    {
        if (isset($this->data[$name]) || array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        return null;
    }
  
    public function __set($name, $value)
    {
        $this->data[$name] = $value;
    }
    
    public function __isset($name)
    {
        return $this->__get($name) !== null;
    }
}

这样,Object 具有的属性就可以动态扩展了, 如:

$ob = new Object();
$ob->name = 'mike';
$ob->age = 25;

那它有什么用武之地呢?

它可以作为一个基类,来封装对数据库的操作,实现自己的 ORM 框架, 如:

DB.php

<?php
class DB {
    public static function insert($collectionName, $data)
    {
        // 创建 mongodb 的连接 $mongodbConnection
        $mongodbConnection->getCollection($collection)->insert($data);
    }
}

Model.php

<?php
  
class Model extends Object {
    pubic function save()
    {
        $className = get_class();
        $collectionName = strtolower($cl);
        // 根据 $collectionName 可以连接选择数据库 table(mysql), collection(mongodb)
        DB::insert($collectionName, $this->data);
    }
}

Test

<?php

class User extends Model {}

class Order extends Model {}

$user = new User();
$user->name = 'mike';
$user->age = 25;
$user->languages = ['php', 'golang'];
$user->save();  // 向 mongodb 的 user collection 中插入一条数据

$order = new Order();
$order->orderNumber = 'P201708220001';
$order->price = '100';
$order->name = '爱茜茜里甜品';
$order->save(); // 向 mongodb 的 order collection 中插入一条数据

当然这里说的只是一个例子, 真正的框架要做的事很多,但是原理性的东西就是那些。

staticself

  • self 正如其名字,指向的是当前类

  • static 指向的则是实际调用类

看下面的示例:

<?php

class A {
    public static function say()
    {
        static::hint();
        self::info();
    }

    public static function hint()
    {
        echo "hint A \n";
    }

    public static function info()
    {
        echo "info A \n";
    }
}

class B extends A {
    public static function hint()
    {
        echo "hint B \n";
    }

    public static function info()
    {
        echo "info B \n";
    }
}


$test = new B();
$test->say();

最后的输出结果为:

hint B   // 使用 static 调用时会调用父类同名方法
info A   // 使用 self 只会调用当前类,而不是调用类的方法

清楚了 self, static的作用方法,在看一些框架代码,或者自己写具有层级关系的代码时,考虑一些方法的作用域时,就可以通过static , self 来决定子类是否可以覆盖父类同名方法了。

php-cliphp-fpm

  • PHP CLI 是命令行接口, 是位于创建独立的程序 (如:在命令行运行一个php文件,执行一些耗时的操作)
  • PHP CGIPHP CGI (通用网关接口) 的一种实现,主要是用于 web 应用。

举一些常见的区别:

  • pcntl_fork 命令只能做 cli 模式,不能再 fpm模式
  • $_SERVER$_POST 这些 这些全局变量就只能在 fpm 模式下有效, 在 cli 下不存在

composer

composerPHP的一个包依赖管理, 定义了一下自动加载规范,可以下载,管理依赖.

匿名函数, 闭包

trait

用于定义一些方法集,可以被其它类使用,感觉主要是为了解决不能多继承的问题

命名空间 (namespace)

与文件系统中的目录结构类似,可以用来区分同名文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • Welcome 目前网络上充斥着大量的陈旧信息,让PHP新手误入歧途,传播着错误的实践和糟糕的代码,这必须得到纠正...
    layjoy阅读 21,596评论 7 118
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,355评论 6 343
  • 你是不是为一成不变的生活苦恼过?这种日子就像白开水一样,无色无味,让我们渴望变化的大脑饥渴不已,总是想找刺激的东西...
    小英成长手札阅读 834评论 7 8
  • 它们是我从小到大养过的若干只狗和若干其他小动物。它们在我的童年里在我的生命里在我的回忆里进进出出,从未止歇。 墨西...
    信笔随心阅读 406评论 0 0