1. 让我们为 PHP 创建枚举,提供一些代码示例
如果我们的代码需要对枚举常量和值进行更多验证,该怎么办?
根据使用情况,我通常会使用类似以下的简单内容:
1
2
3
4
5
6
7
8
|
abstract class DaysOfWeek
{
const Sunday = 0;
const Monday = 1;
// etc.
}
$today = DaysOfWeek::Sunday;
|
这是一个扩展的示例,可以更好地服务于更广泛的案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
abstract class BasicEnum {
private static $constCacheArray = NULL;
private static function getConstants() {
if (self:: $constCacheArray == NULL) {
self:: $constCacheArray = [];
}
$calledClass = get_called_class();
if (! array_key_exists ( $calledClass , self:: $constCacheArray )) {
$reflect = new ReflectionClass( $calledClass );
self:: $constCacheArray [ $calledClass ] = $reflect - > getConstants();
}
return self:: $constCacheArray [ $calledClass ];
}
public static function isValidName( $name , $strict = false) {
$constants = self::getConstants();
if ( $strict ) {
return array_key_exists ( $name , $constants );
}
$keys = array_map ( 'strtolower' , array_keys ( $constants ));
return in_array( strtolower ( $name ), $keys );
}
public static function isValidValue( $value , $strict = true) {
$values = array_values (self::getConstants());
return in_array( $value , $values , $strict );
}
}
|
我们可以将其用作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
abstract class DaysOfWeek extends BasicEnum {
const Sunday = 0;
const Monday = 1;
const Tuesday = 2;
const Wednesday = 3;
const Thursday = 4;
const Friday = 5;
const Saturday = 6;
}
DaysOfWeek::isValidName( 'Humpday' ); // false
DaysOfWeek::isValidName( 'Monday' ); // true
DaysOfWeek::isValidName( 'monday' ); // true
DaysOfWeek::isValidName( 'monday' , $strict = true); // false
DaysOfWeek::isValidName(0); // false
DaysOfWeek::isValidValue(0); // true
DaysOfWeek::isValidValue(5); // true
DaysOfWeek::isValidValue(7); // false
DaysOfWeek::isValidValue( 'Friday' ); // false
|
2. 什么是 PHP 自动加载类?
使用自动加载器,PHP 允许在由于错误而失败之前最后一次加载类或接口。
PHP 中的 spl_autoload_register() 函数可以注册任意数量的自动加载器,即使未定义类和接口也可以自动加载。
1
2
3
4
5
|
spl_autoload_register( function ( $classname ) {
include $classname . '.php' ;
});
$object = new Class1();
$object2 = new Class2();
|
在上面的示例中,我们不需要包含 Class1.php 和 Class2.php。spl_autoload_register() 函数将自动加载 Class1.php 和 Class2.php。
3. PHP 是否支持方法重载?
方法重载是使用具有不同签名的相同方法名称的现象。PHP 中函数签名仅基于它们的名称,并且不包含参数列表,因此不能有两个具有相同名称的函数,所以 PHP 不支持方法重载。
但是,您可以声明一个可变函数,它接受可变数量的参数。您可以使用 func_num_args() 和 func_get_arg() 来传递参数并正常使用它们。
1
2
3
4
5
6
7
8
9
10
11
12
|
function myFunc() {
for ( $i = 0; $i < func_num_args(); $i ++) {
printf( "Argument %d: %s\n" , $i , func_get_arg( $i ));
}
}
/*
Argument 0: a
Argument 1: 2
Argument 2: 3.5
*/
myFunc( 'a' , 2, 3.5);
|
问答:不是有 __ autoload 吗 为什么不用?
自动加载的原理以及__autoload 的使用:
自动加载的原理,就是在我们 new 一个 class 的时候,PHP 系统如果找不到你这个类,就会去自动调用本文件中的__autoload ($class_name) 方法,我们 new 的这个 class_name 就成为这个方法的参数。所以我们就可以在这个方法中根据我们需要 new class_name 的各种判断和划分就去 require 对应的路径类文件,从而实现自动加载。
spl_autoload_register 的使用:
如果一个项目过大,或者需要不同的自动加载来加载不同路径的文件,这个时候 autoload 就不好用了,
原因是一个项目中只能有一个这样的 autoload () 函数,因为 PHP 不允许函数重名,
也就是说你不能声明 2 个__autoload () 函数文件,否则会报致命错误,
所以,可以用新的 spl_autoload_register () 来取代它。并且,它执行效率更高,更灵活。
到此这篇关于php自动加载代码实例详解的文章就介绍到这了,更多相关php自动加载内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/liuxingjiaoyuC/article/details/114063076