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 === null) {
$inst = new UserFactory();
}
return $inst;
} /**
* Private ctor so nobody else can instantiate it
*
*/
private
function __construct() { }
}

使用方法:

$fact = UserFactory::Instance();
$fact2 = UserFactory::Instance();

但:

$fact = new UserFactory()

引发错误。

Q29:PDO的query()与execute()有什么区别?

  • query 运行标准SQL语句,并要求你正确转义所有数据,以避免SQL注入和其他问题。
  • execute运行一个准备好的语句,该语句使你可以绑定参数以避免转义或引用参数。如果多次重复查询,execute也将表现更好。

最佳实践是坚持使用准备好的语句并执行以提高安全性。除了在客户端提供转义功能外,准备好的语句在服务器端也会编译一次,然后可以在每次执行时传递不同的参数。

Q30:空合并运算符的用途是什么?

空合并操作符将返回其第一个操作数(如果存在)并且不为NULL。否则,它将返回其第二个操作数。

例:

$name = $firstName ?? $username ?? $placeholder ?? "Guest"; 

Q31:区分异常和错误

  • Error无法从中恢复。错误的唯一解决方案是终止执行。Exception通过使用try-catch块或将异常抛出给调用者,你可以从中恢复。
  • 你将无法处理Errors使用try-catch块。即使使用try-catch块处理它们,应用程序也无法恢复。另一方面,Exceptions可以使用try–catch块进行处理,并且可以使程序流程正常(如果发生)。
  • Exceptions与Errors运行应用程序的环境相关的应用程序有关。

Q32:什么是异常类函数?

在Exception类中可以使用以下功能。

  • getMessage() −例外消息
  • getCode() −例外代码
  • getFile() -源文件名
  • getLine() −源代码行
  • getTrace() − n个数组 backtrace()
  • getTraceAsString() −格式化的跟踪字符串
  • Exception::__toString 给出异常的字符串表示形式。

Q33:区分参数化和非参数化功能

  • 非参数化函数在调用时不接受任何参数。
  • 参数化函数在调用时采用一个或多个参数。当输出取决于运行时给定的动态值时,可以在程序的运行时使用它们。有两种方法可以访问参数化函数:
    1. 按值调用:(这里我们直接传递值)
    2. 通过引用调用:(此处传递存储值的地址位置)

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_array);
echo "\$a = $a; \$b = $b; \$c = $c";

输出:

$a = Cat; $b = Dog; $c = Horse

Q36:解释什么是PHP闭包,为什么它使用“ use”标识符?

考虑以下代码:

public 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, $callback);
return round($total, 2);
}

你能解释一下为什么使用它吗?

这就是PHP表示闭包的方式。基本上,这意味着你允许匿名函数在其作用域之外 “捕获”局部变量(在本例中为,$ tax并引用$ total)并保留其值(或在$ total的情况下,对$ total本身的引用) )作为匿名函数本身内部的状态。

闭包是一个单独的命名空间,通常,您不能访问此命名空间之外定义的变量。

  • use 允许你访问(使用)闭包内部的后续变量。
  • use是早期的约束力。这意味着在定义闭包时将复制变量值。因此,在闭包内部修改$ tax不会产生外部影响,除非它像对象一样是指针。
  • 你可以像的情况一样将变量作为指针传递&$ total。这样,修改$totalDOES 的值会产生外部影响,原始变量的值会更改。

Q37:PHP中最新的静态绑定到底是什么?

基本上,可以归结为以下事实:self关键字不遵循相同的继承规则。 self始终解析为使用它的类。这意味着,如果你在父类中创建一个方法并从子类中调用该方法,self则不会像你期望的那样引用该子项。

后期静态绑定为static关键字引入了新用法,从而解决了这一特殊缺点。当你使用时static,它代表你第一次使用它的类,即。它“绑定”到运行时类。

考虑:

class Car {
public static
function run() {
return static::getName();
} private static
function getName() {
return 'Car';
}
} class Toyota extends Car {
public static
function getName() {
return 'Toyota';
}
} echo Car::run(); // Output: Car
echo Toyota::run(); // Output: Toyota

Q38:如何衡量PHP脚本的执行时间?

我想知道执行一次PHP while循环需要多少毫秒。你可以帮帮我吗?

你可以使用此microtime功能。

考虑:

$start = microtime(true);
while (...) { }
$time_elapsed_secs = microtime(true) - $start;

Q39:合并两个PHP对象的最佳方法是什么?

//We have this:
$objectA->a;
$objectA->b;
$objectB->c;
$objectB->d; //We want the easiest way to get:
$objectC->a;
$objectC->b;
$objectC->c;
$objectC->d;

这有效:

$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);

你也可以使用array_merge_recursive有深层复制行为。

另一种方法是:

foreach($objectA as $k => $v) $objectB->$k = $v;

这比<7版本的PHP中的第一个答案要快(估计要快50%)。但是在PHP> = 7中,第一个答案快了400%。

Q40:比较mysqli或PDO-优缺点是什么?

让我们命名:

  • PDO是标准,这是大多数开发人员期望使用的标准。
  • 将应用程序从一个数据库迁移到另一个数据库并不常见,但是迟早你可能会发现自己正在使用不同的RDBMS处理另一个项目。如果您在家中使用PDO,那么到那时至少要少学习一件事。
  • 使用PDO的真正好处是你可以获取数据,并将其自动注入到对象中。
  • PDO具有一些有助于SQL注入的功能
  • 从执行速度的角度来看,MySQLi会胜出,但是除非你使用MySQLi有很好的包装器,否则它处理预准备语句的功能将很糟糕。插入-几乎相等,选择-非准备语句的mysqli速度快〜2.5%,准备语句的速度快6.7%。

Q41:太空飞船运营商有什么用途?

该<=>运算符将提供组合比较,因为它将:

  • 如果两边的值相等,则返回0
  • 如果左边的值更大,则返回1
  • 如果右侧的值较大,则返回-1

考虑:

//Comparing Integers
echo 1 <= > 1; //outputs 0
echo 3 <= > 4; //outputs -1
echo 4 <= > 3; //outputs 1 //String Comparison echo "x" <= > "x"; //
echo "x" <= > "y"; //-1
echo "y" <= > "x"; //

Q42:PHP是否具有线程?

标准php不提供任何多线程功能,但实际上有一个(实验)扩展名- pthreads。第二个最好的办法是只让一个脚本通过CLI执行另一个脚本,但这有点基本。根据您尝试执行的操作以及操作的复杂程度,这可能是,也可能不是。

Q43:PHP是单线程还是多线程?

PHP本质上不是单线程的。但是,在这种情况下,Unix系统上最常见的PHP安装是单线程安装,最常见的Apache安装也是如此,而nginx却没有基于线程的体系结构。在最常见的Windows设置和一些更高级的Unix设置中,PHP可以并且确实在一个进程中操作多个解释器线程。

自2000年以来,作为解释器的PHP就支持多线程。

Q44:提供一些方法来模仿PHP中的多个构造函数

众所周知,你不能在PHP类中放置两个具有唯一参数签名的__construct函数,但我想这样做:

class Student
{
protected $id;
protected $name;
// etc. public function __construct($id){
$this->id = $id;
// other members are still uninitialised
} public function __construct($row_from_database){
$this->id = $row_from_database->id;
$this->name = $row_from_database->name;
// etc.
}
}

用PHP实现此目的的最佳方法是什么?

我可能会做这样的事情:

class Student
{
public function __construct() {
// allocate your stuff
} public static function withID( $id ) {
$instance = new self();
$instance->loadByID( $id );
return $instance;
} public static function withRow( array $row ) {
$instance = new self();
$instance->fill( $row );
return $instance;
} protected function loadByID( $id ) {
// do query
$row = my_awesome_db_access_stuff( $id );
$this->fill( $row );
} protected function fill( array $row ) {
// fill all properties from array
}
}

然后,如果我想要一个我知道ID的学生:

$student = Student::withID( $id );

从技术上讲,你不是在构建多个构造函数,而只是在构建静态辅助方法,而是通过这种方式避免在构造函数中使用大量意大利面条式代码。

另一种方法是结合使用工厂风格和流利风格:

class Student
{
protected $firstName;
protected $lastName;
// etc. /**
* Constructor
*/
public function __construct() {
// allocate your stuff
} /**
* Static constructor / factory
*/
public static function create() {
$instance = new self();
return $instance;
} /**
* FirstName setter - fluent style
*/
public function setFirstName( $firstName) {
$this->firstName = $firstName;
return $this;
} /**
* LastName setter - fluent style
*/
public function setLastName( $lastName) {
$this->lastName = $lastName;
return $this;
}
} // create instance
$student= Student::create()->setFirstName("John")->setLastName("Doe");

Q45:如何在PHP中实现方法重载?

你不能重载PHP函数。函数签名仅基于它们的名称,并且不包括参数列表,因此不能有两个具有相同名称的函数。

但是,你可以声明一个可变参数,该可变参数接受可变数量的参数。你将使用func_num_args()和func_get_arg()获取参数,并正常使用它们。

考虑:

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);

更多学习内容可以访问从码农成为架构师的修炼之路

找工作的你不容错过的45个PHP面试题附答案(下篇)的更多相关文章

  1. 找工作的你不容错过的45个PHP面试题附答案(上篇)

    Q1: == 和 === 之间有什么区别? 如果是两个不同的类型,运算符 == 则在两个不同的类型之间进行强制转换 === 操作符执行 ’ 类型安全比较’ 这意味着只有当两个操作数具有相同的类型和相同 ...

  2. 转:45 个 LoadRunner 面试问题(附答案)_纯英文,太有逼格了

    What is load testing? - Load testing is to test that if the application works fine with the loads th ...

  3. iOS开发人员不容错过的10大工具

    内容简介 1.iOS简介 2.iOS开发十大实用工具之开发环境 3.iOS开发十大实用工具之图标设计 4.iOS开发十大实用工具之原型设计 5.iOS开发十大实用工具之演示工具 6.iOS开发十大实用 ...

  4. 每位iOS开发人员不容错过的10大实用工具

    内容简介 1.iOS简介 2.iOS开发十大实用工具之开发环境 3.iOS开发十大实用工具之图标设计 4.iOS开发十大实用工具之原型设计 5.iOS开发十大实用工具之演示工具 6.iOS开发十大实用 ...

  5. 不容错过的超赞项目管理PPT

    不容错过的超赞项目管理PPT(转载) 大公司的一个好处,是各个领域都有牛人,可以为你提供经验分享交流.腾讯庞大的培训体系更是保证了:如果你想学点什么东西,你总可以学到.腾讯内部资源30页PPT曝光 — ...

  6. 每位iOS开发者不容错过的10大有用工具

    内容简单介绍 1.iOS简单介绍 2.iOS开发十大有用工具之开发环境 3.iOS开发十大有用工具之图标设计 4.iOS开发十大有用工具之原型设计 5.iOS开发十大有用工具之演示工具 6.iOS开发 ...

  7. 13个不容错过的Java项目

    今天我们将整理一大波干货满满的Java示例代码与能力展示素材. GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自有代码或者学习编程技能.无论如何,开发工作当中我们几乎 ...

  8. IT行业歧视40岁以上人群为找工作还要谎报年龄[转]

    IT行业歧视40岁以上人群为找工作还要谎报年龄(这样不好) http://www.aliyun.com/zixun/content/2_6_616161.html [赛迪网讯]4月5日消息,许多40多 ...

  9. 你不容错过的 腾讯 AlloyTeam Web 前端大会 看点完全剖析

    AC大会 ( Alloyteam Conf ),是由腾讯前端技术团队的标杆团队 AlloyTeam 发起的前端技术大会,旨在分享团队在技术研究.产品研发.开源项目的经验沉淀.AC2017 将会继续在工 ...

随机推荐

  1. day40 作业

    利用线程和进程实现tcp 服务端 from multiprocessing import Process from threading import Thread import socket def ...

  2. 阿里云centos7服务器nginx配置及常见问题解答

    前言: 本文参考了jackyzm的博客:https://www.cnblogs.com/jackyzm/p/9600738.html,进行了内容的更新,并请注意这里适用的版本是centos7的版本.并 ...

  3. Python 图像处理 OpenCV (13): Scharr 算子和 LOG 算子边缘检测技术

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  4. Hadoop基础(二):从Hadoop框架讨论大数据生态

    1 Hadoop是什么 2 Hadoop三大发行版本 Hadoop三大发行版本:Apache.Cloudera.Hortonworks. Apache版本最原始(最基础)的版本,对于入门学习最好. C ...

  5. 对掌机游戏Pokemon的一部分系统的拆解流程图

    整体系统拆解 POKEMON系统拆解 属性.技能.进化形态 属性提升系统 种族值说明: 所有Pokemon都拥有自己的种族的种族值,且固定(例如:小火龙:309, 皮卡丘: 320) 种族值是各项属性 ...

  6. bzoj2134单选错位

    bzoj2134单选错位 题意: 试卷上n道选择题,每道分别有ai个选项.某人全做对了,但第i道题的答案写在了第i+1道题的位置,第n道题答案写在第1题的位置.求期望能对几道.n≤10000000 题 ...

  7. 【Python学习笔记三】一个简单的python爬虫

    这里写爬虫用的requests插件 1.一般那3.x版本的python安装后都带有相应的安装文件,目录在python安装目录的Scripts中,如下:   2.将scripts的目录配置到环境变量pa ...

  8. NCRE-Python考点

    NCRE-Python考点 作者:封亚飞本文不含 文件处理.面向对象程序设计.公共基础.计算生态希望各位可以批评指正Qq 64761294 由于图片上传不方便,需要真题的朋友可以加我的qq找我要pdf ...

  9. python golang中grpc 使用示例代码详解

    python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...

  10. 微信小程序开发(一)基础知识学习

    1.特点:   ①无DOM对象(虚拟DOM),一切基于组件化(复用.解耦) ②四个重要文件: *.js.*.wxml --> html..wxss --> css.*.json ③无需下载 ...