分类 PHP 下的文章

依赖注入:A类需要调用B类的功能,所以需要一个B类的对象,一般的写法是在A类中直接实例化B类以获取对象,而依赖注入则是在A类外部实例化B类,然后将B类的对象通过参数注入到A类。

控制反转:将类与类之间的依赖关系管理由内部提到外部进行管理,以此降低程序组件间的耦合度。

ReflectionClass反射类:可用于判断一个类是否可以被实例化、是否有构造函数、获取构造函数的参数、判断参数是否为一个依赖类。

使用反射,我们可以实现从外部判断一个类需要依赖哪些其他类,然后使用程序自动将被依赖类实例化,注入要调用的类。

下面是一个浅显易懂的例子,Controller类需要依赖Db类,所以在构造函数中将Db作为参数,我们在test.php中编写一个maker()函数用于自动创建类的对象,当被依赖的类需要依赖其它类时,maker()函数会被递归调用。

- 阅读剩余部分 -

<?php

//接口类,约束参数与方法
interface Db
{
    public function execute($param);
}

//实现类,按接口约束的方法实现功能
class Db_Mysql implements Db
{
    public function execute($param)
    {
        print_r($param);
    }
}

在脚本中使用 spl_autoload_register(['className','functionName']) 进行注册,需要注意这个方法需要是个静态方法,且需要有一个参数。

调用找不到的类时PHP会自动调用这里注册的方法,并给此方法提交一个参数,内容为不存在的类(含命名空间),此方法只需要根据命名空间判断找不到的类是不是需要自己引入的类(比如自己程序的自动加载与Composer的自动加载共存时),是的话加载文件并返回 true,不是的话返回 false

spl_autoload_register(['className','functionName']) 可以多次调用注册多个方法,PHP会按照注册顺序依次调用,直到找不到的类被自动加载为止。

参考:官方文档

可使用array_merge()函数或array_merge_recursive()函数。
两函数用法相同,均为将多个数组作为参数传入,如:array_merge($arr1, $arr2, $arr3, $arr4)
区别在于array_merge()函数键值冲突时后面的会覆盖前面的,array_merge_recursive()函数键值冲突时会将冲突部分合并为新数组。

举个例子:

<?php
$arr1 = ['a'=>1, 'b'=>2];
$arr2 = ['b'=>3, 'c'=>4];
print_r(array_merge($arr1, $arr2));
//结果为:Array([a] => 1 [b] => 3 [c] => 4)

print_r(array_merge_recursive($arr1, $arr2));
//结果为:Array([a] => 1 [b] => Array([0] => 2 [1] => 3) [c] => 4)

print_r(array_merge([0, 1, 2], [0, 1, 2]));
//结果为:Array([0] => 0 [1] => 1 [2] => 2 [3] => 0 [4] => 1 [5] => 2)

break与continue语句均可用于跳出循环,区别在于:
continue跳出本次循环,但此循环语句会继续。
break跳出此循环语句,但外面嵌套(如果有)的循环语句仍然会继续。

举个例子:

<?php
$arr = [0, 1, 2, 3];

foreach($arr as $row){
    foreach($arr as $num){
        if($num === 2){
            break;
        }else{
            echo $num;
        }
    }
}
//输出结果为:01010101

foreach($arr as $row){
    foreach($arr as $num){
        if($num === 2){
            continue;
        }else{
            echo $num;
        }
    }
}
//输出结果为:013013013013