篇文章主要介绍了php自动加载代码实例详解,文中代码讲解的很清晰,有感兴趣的同学可以研究下

  1. 让我们为 PHP 创建枚举,提供一些代码示例

如果我们的代码需要对枚举常量和值进行更多验证,该怎么办?
根据使用情况,我通常会使用类似以下的简单内容:

  1. abstract class DaysOfWeek
  2. {
  3. const Sunday = 0;
  4. const Monday = 1;
  5. // etc.
  6. }
  7. $today = DaysOfWeek::Sunday;

这是一个扩展的示例,可以更好地服务于更广泛的案例:

  1. abstract class BasicEnum {
  2. private static $constCacheArray = NULL;
  3. private static function getConstants() {
  4. if (self::$constCacheArray == NULL) {
  5. self::$constCacheArray = [];
  6. }
  7. $calledClass = get_called_class();
  8. if (!array_key_exists($calledClass, self::$constCacheArray)) {
  9. $reflect = new ReflectionClass($calledClass);
  10. self::$constCacheArray[$calledClass] = $reflect - > getConstants();
  11. }
  12. return self::$constCacheArray[$calledClass];
  13. }
  14. public static function isValidName($name, $strict = false) {
  15. $constants = self::getConstants();
  16. if ($strict) {
  17. return array_key_exists($name, $constants);
  18. }
  19. $keys = array_map('strtolower', array_keys($constants));
  20. return in_array(strtolower($name), $keys);
  21. }
  22. public static function isValidValue($value, $strict = true) {
  23. $values = array_values(self::getConstants());
  24. return in_array($value, $values, $strict);
  25. }
  26. }

我们可以将其用作:

  1. abstract class DaysOfWeek extends BasicEnum {
  2. const Sunday = 0;
  3. const Monday = 1;
  4. const Tuesday = 2;
  5. const Wednesday = 3;
  6. const Thursday = 4;
  7. const Friday = 5;
  8. const Saturday = 6;
  9. }
  10. DaysOfWeek::isValidName('Humpday'); // false
  11. DaysOfWeek::isValidName('Monday'); // true
  12. DaysOfWeek::isValidName('monday'); // true
  13. DaysOfWeek::isValidName('monday', $strict = true); // false
  14. DaysOfWeek::isValidName(0); // false
  15. DaysOfWeek::isValidValue(0); // true
  16. DaysOfWeek::isValidValue(5); // true
  17. DaysOfWeek::isValidValue(7); // false
  18. DaysOfWeek::isValidValue('Friday'); // false
  1. 什么是 PHP 自动加载类?

使用自动加载器,PHP 允许在由于错误而失败之前最后一次加载类或接口。
PHP 中的 spl_autoload_register() 函数可以注册任意数量的自动加载器,即使未定义类和接口也可以自动加载。

  1. spl_autoload_register(function ($classname) {
  2. include $classname . '.php';
  3. });
  4. $object = new Class1();
  5. $object2 = new Class2();

在上面的示例中,我们不需要包含 Class1.php 和 Class2.php。spl_autoload_register() 函数将自动加载 Class1.php 和 Class2.php。

方法重载是使用具有不同签名的相同方法名称的现象。PHP 中函数签名仅基于它们的名称,并且不包含参数列表,因此不能有两个具有相同名称的函数,所以 PHP 不支持方法重载。
但是,您可以声明一个可变函数,它接受可变数量的参数。您可以使用 func_num_args() 和 func_get_arg() 来传递参数并正常使用它们。

  1. function myFunc() {
  2. for ($i = 0; $i < func_num_args(); $i++) {
  3. printf("Argument %d: %s\n", $i, func_get_arg($i));
  4. }
  5. }
  6. /*
  7. Argument 0: a
  8. Argument 1: 2
  9. Argument 2: 3.5
  10. */
  11. 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自动加载代码实例详解的文章就介绍到这了。

更多相关文章

  1. Android使用cmake+ndk输出原生Log
  2. 使用GDB调试Android(安卓)NDK native(C/C++)程序
  3. Android: Binder
  4. 创建Android虚拟设备(AVD)
  5. Android(安卓)Broadcast receiver使用入门
  6. android 弹出日期滑动选择框,日期滚动滑动选择
  7. Android(安卓)使用Parcelable传递对象
  8. Android(安卓)下使用 JSON 实现 HTTP 请求,外加几个示例!
  9. 转---Android(安卓)Audio System 之一:AudioTrack如何与AudioFlin

随机推荐

  1. 疯狂XML学习笔记(13)---------XML DOM
  2. Java&Xml教程(十)XML作为属性文件使用
  3. XML—XML介绍和基本语法
  4. 疯狂XML学习笔记(12)------------XPath
  5. Java&Xml教程(八)使用JDOM将Java对象转换为
  6. ajax的xmlHttpRequest对象
  7. Java&Xml教程(七)使用JDOM修改XML文件内容
  8. 疯狂XML学习笔记(11)-----------XSLT讲解
  9. Java&Xml教程(六)使用JDOM解析XML文件
  10. 疯狂XML学习笔记(10)---------XML的作用