高级技术-php框架开发必知的高级技术点
php框架开发中需要提供一些灵活的特性,作为框架的扩展点,也就是框架使用者的可以按照一定的编程规范就可以很快的实现业务功能,而不需要关系太多的技术细节;本文的技术点就是框架底层常用的几种高级技术点
匿名函数和类
在以下示例中,匿名函数用作回调以帮助按年龄对人进行排序。
$list = [ ['name' => 'John', 'age' => 31], ['name' => 'Mike', 'age' => 25], ['name' => 'Ben', 'age' => 27] ]; usort($list, function($a, $b) { if ($a['age'] == $b['age']) { return 0; } return ($a['age'] < $b['age']) ? -1 : 1; });
接下来,动态创建函数并将其保存到变量中,然后调用并最终销毁。
$sqrt = function($a) { return $a * $a; }; echo $sqrt(2); unset($sqrt);
自动加载类
在PHP中编写面向对象的应用程序时,每个类创建一个文件是最佳实践。这样,类更容易开发和维护,应用程序只能加载完成请求所需的类。这可以通过注册类自动加载功能来实现,该功能将在需要时包含类文件。所以不要写:
include "some/dir/Class1.php" include "some/dir/Class2.php" include "some/dir/Class3.php"
你可以写
spl_autoload_register(function ($class) { include "some/dir/" . $class . ".php"; });
然后以下代码将正常工作。
$object1 = new Class1(); $object2 = new Class2(); // Class3 不会被加载
将错误转换为异常
PHP之前的PHP 7错误报告有点乱。在PHP 7中有一些改进。将错误转换为异常技术多年来一直很好用,所以我想向您展示。这有几行,将改善您管理错误的方式。
set_error_handler(function($errorNumber, $errorMessage, $errorFile, $errorLine) { throw new \ErrorException($errorMessage, 0, $errorNumber, $errorFile, $errorLine); });
所以现在你唯一需要担心的是捕获异常。这比压缩错误,注册自定义处理程序和处理不同的错误处理配置(在php.ini,运行时,自定义处理程序等)容易得多。这是一个例子:
try { echo 5 / 0; } catch (Exception $e) { print_r($e); }
魔术方法
面向对象的编程目前非常流行,PHP提供了一种很好的方式将它提升到一个新的水平。Magic方法允许您调整对类的方法或属性的调用,并在发生特定操作时更新对象状态。
想象一下,你必须创建以下类:
class Person { public $age = null; public $eyesColor = null; public $hairColor = null; }
您可以提供魔术方法__construct来设置创建的对象的默认值。
class Person { public $age = null; public $eyesColor = null; public $hairColor = null; function __construct(){ $this->age = 20; $this->eyesColor = 'blue'; $this->hairColor = 'brown'; } }
您可以使用__set验证属性并使用__get检索它们。
class Person { private $data = []; public $eyesColor = null; public $hairColor = null; function __set($name, $value) { if ($name === 'age') { if (is_int($value) && $value >= 18) { $this->data[$name] = $value; } else { throw new InvalidArgumentException('Age is invalid. Must be at least 18.'); } } } function __get($name) { return isset($this->data[$name]) ? $this->data[$name] : null; } function __isset($name) { return isset($this->data[$name]); } function __unset($name) { if (isset($this->data[$name])) { unset($this->data[$name]); } } }
register_shutdown_function
顾名思义,此函数会注册一个函数,该函数将在请求执行即将完成时调用。我经常用它来检查致命错误和打印友好输出。
register_shutdown_function(function() { $errorData = error_get_last(); if (is_array($errorData)) { ob_end_clean(); echo 'Error occured! - ' . $errorData['message']; } });
命令行
PHP主要被称为支持我们网页的流行服务器语言之一。但它不仅仅适用于网页。您可以编写可以从命令行调用的有用脚本和程序。这是一个例子:
php hello-world.php -name John
变量$ argv包含传递的所有参数。索引0是文件名。
if (isset($argv[1]) && $argv[1] === '-help') { echo 'Enter -name <your-name> so I can greet you properly.'; exit(); } if (isset($argv[1], $argv[2]) && $argv[1] === '-name') { echo 'Hello, ' . $argv[2]; exit(); } echo 'Invalid command. Type -help for help.'; exit();