找工作的你不容错过的45个PHP面试题附答案(下篇)
找工作的你不容错过的45个PHP面试题附答案(上篇)Q28:你将如何使用PHP创建Singleton类?/** * Singleton class * */ final class UserFactory { * * Call this method to get singleton * * @return UserFactory */ public static function Instance() { static $inst = null; if ($inst === ) { new UserFactory(); } return $inst; } * * Private ctor so nobody else can instantiate it * private __construct() { } } 使用方法: $fact = UserFactory::Instance(); $fact2 = UserFactory::Instance(); 但: $fact = new UserFactory() 引发错误。 Q29:PDO的query()与execute()有什么区别?
最佳实践是坚持使用准备好的语句并执行以提高安全性。除了在客户端提供转义功能外,准备好的语句在服务器端也会编译一次,然后可以在每次执行时传递不同的参数。 Q30:空合并运算符的用途是什么?空合并操作符将返回其第一个操作数(如果存在)并且不为NULL。否则,它将返回其第二个操作数。 例: $name = $firstName ?? $username ?? $placeholder ?? "Guest"; Q31:区分异常和错误
Q32:什么是异常类函数?在Exception类中可以使用以下功能。
Q33:区分参数化和非参数化功能
Q34:通过引用解释函数调用在通过引用调用的情况下,如果实际值在函数内部进行了修改,则将对其进行修改。在这种情况下,我们需要使用&带形式参数的符号。在&表示可变的参考。 例: function adder(&$str2) { $str2 .= 'Call By Reference'; } $str = 'This is '; adder($str); echo $str; 输出: This is Call By Reference Q35:为什么我们使用extract()?该extract()函数将变量从数组导入局部符号表。 例: $a = "Original"; $my_array = array("a" => "Cat","b" => "Dog","c" => "Horse"); extract($my_arrayecho "$a = $a; $b = $b; $c = $c"; 输出: $a = Cat; $b = Dog; $c = Horse Q36:解释什么是PHP闭包,为什么它使用“ use”标识符?考虑以下代码: function getTotal($tax) { $total = 0.00; $callback = function ($quantity,$product) use ($tax,&$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($this->products,1)">$callback); return round($total,2); } 你能解释一下为什么使用它吗?
闭包是一个单独的命名空间,通常,您不能访问此命名空间之外定义的变量。
Q37:PHP中最新的静态绑定到底是什么?基本上,可以归结为以下事实:self关键字不遵循相同的继承规则。 self始终解析为使用它的类。这意味着,如果你在父类中创建一个方法并从子类中调用该方法,self则不会像你期望的那样引用该子项。 后期静态绑定为static关键字引入了新用法,从而解决了这一特殊缺点。当你使用时static,它代表你第一次使用它的类,即。它“绑定”到运行时类。 考虑: Car { run() { static::getName(); } private getName() { return 'Car'; } } class Toyota extendsreturn 'Toyota'echo Car::run(); // Output: Car echo Toyota::run(); Output: Toyota Q38:如何衡量PHP脚本的执行时间?我想知道执行一次PHP while循环需要多少毫秒。你可以帮帮我吗? 你可以使用此microtime功能。 考虑: $start = microtime(truewhile (...) { } $time_elapsed_secs = true) - $start; Q39:合并两个PHP对象的最佳方法是什么?We have this: $objectA->a; b; $objectB->c; d; We want the easiest way to get: $objectC->$objectC->d; 这有效: $obj_merged = (object) array_merge((array) $obj1,($obj2); 你也可以使用array_merge_recursive有深层复制行为。 另一种方法是: foreach($objectA as $k => $v) $objectB->$k = $v; 这比<7版本的PHP中的第一个答案要快(估计要快50%)。但是在PHP> = 7中,第一个答案快了400%。 Q40:比较mysqli或PDO-优缺点是什么?让我们命名:
Q41:太空飞船运营商有什么用途?该<=>运算符将提供组合比较,因为它将:
考虑: Comparing Integers echo 1 <= > 1; outputs 0 echo 3 <= > 4; outputs -1 echo 4 <= > 3; outputs 1 //String Comparison echo "x" <= > "x"; 0 echo "x" <= > "y"; -1 echo "y" <= > "x"; 1 Q42:PHP是否具有线程?标准php不提供任何多线程功能,但实际上有一个(实验)扩展名- pthreads。第二个最好的办法是只让一个脚本通过CLI执行另一个脚本,但这有点基本。根据您尝试执行的操作以及操作的复杂程度,这可能是,也可能不是。 Q43:PHP是单线程还是多线程?PHP本质上不是单线程的。但是,在这种情况下,Unix系统上最常见的PHP安装是单线程安装,最常见的Apache安装也是如此,而nginx却没有基于线程的体系结构。在最常见的Windows设置和一些更高级的Unix设置中,PHP可以并且确实在一个进程中操作多个解释器线程。 自2000年以来,作为解释器的PHP就支持多线程。 Q44:提供一些方法来模仿PHP中的多个构造函数众所周知,你不能在PHP类中放置两个具有唯一参数签名的__construct函数,但我想这样做: Student { protected $id; $name etc. function __construct(){ $this->id = ; other members are still uninitialised } $row_from_database$row_from_database->id; $this->name = name; etc. } } 用PHP实现此目的的最佳方法是什么? 我可能会做这样的事情: Student { __construct() { allocate your stuff } static function withID( ) { $instance = self(); $instance->loadByID( ); $instancefunction withRow( array $row$instance->fill( protected function loadByID( ) { do query $row = my_awesome_db_access_stuff( ); $this->fill( ); } function fill( fill all properties from array } } 然后,如果我想要一个我知道ID的学生: $student = Student::withID( $id ); 从技术上讲,你不是在构建多个构造函数,而只是在构建静态辅助方法,而是通过这种方式避免在构造函数中使用大量意大利面条式代码。 另一种方法是结合使用工厂风格和流利风格: $firstName; $lastName etc. * * Constructor * * Static constructor / factory create() { self(); * * FirstName setter - fluent style function setFirstName( ) { $this->firstName = $this* * LastName setter - fluent style function setLastName( $this->lastName = create instance $student= Student::create()->setFirstName("John")->setLastName("Doe"); Q45:如何在PHP中实现方法重载?你不能重载PHP函数。函数签名仅基于它们的名称,并且不包括参数列表,因此不能有两个具有相同名称的函数。 但是,你可以声明一个可变参数,该可变参数接受可变数量的参数。你将使用func_num_args()和func_get_arg()获取参数,并正常使用它们。 考虑: myFunc() { for ($i = 0; $i < func_num_args(); $i++) { printf("Argument %d: %sn",1)">$i,func_get_arg($i)); } } Argument 0: a Argument 1: 2 Argument 2: 3.5 */ myFunc('a',2,3.5); 更多学习内容可以访问从码农成为架构师的修炼之路 ? 以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的PHP技术交流群953224940 进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |