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. 基于web的图书管理系统设计与实现

    原文链接:基于web的图书管理系统设计与实现 系统演示链接:点击这里查看演示 01 系统简述     图书管理系统就是利用计算机,结合互联网对图书进行结构化.自动化管理的一种软件,来提高对图书的管理效 ...

  2. java 面向对象(二十九):异常(二)异常的处理

    1.java异常处理的抓抛模型过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象. * 并将此对象抛出. * 一旦抛出对象以后,其后的代 ...

  3. 机器学习实战基础(三十):决策树(三) DecisionTreeRegressor

    DecisionTreeRegressor class sklearn.tree.DecisionTreeRegressor (criterion=’mse’, splitter=’best’, ma ...

  4. 数据可视化之DAX篇(九) 关于DAX中的VAR,你应该避免的一个常见错误

    https://zhuanlan.zhihu.com/p/67803111 本文源于微博上一位朋友的问题,在计算同比增长率时,以下两种DAX代码有什么不同? -------------------- ...

  5. ASP.NET Core策略授权和 ABP 授权

    目录 ASP.NET Core 中的策略授权 策略 定义一个 Controller 设定权限 定义策略 存储用户信息 标记访问权限 认证:Token 凭据 颁发登录凭据 自定义授权 IAuthoriz ...

  6. (五)学习了解OrchardCore笔记——灵魂中间件ModularTenantContainerMiddleware的第一行②模块的功能部分

    在(三)的时候已经说到模块集合用ForEachAsync的扩展方法分配多个任务,把每个modules的ManifestInfo分析出来的功能加入ConcurrentDictionary.我们先看看这个 ...

  7. Python切图脚本

    背景: 时值疫情,作业需要在网上提交.最近老师改变了交作业方式,之前是提交完整的作业图片即可,现在需要将完整的作业图片切分成一题一题的提交,如果手动切分较麻烦,故本人写了个python脚本实现自动切分 ...

  8. JAVA集合四:比较器--类自定义排序

    参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...

  9. Makefile中的目标

    Makefile中的目标 一般目标 目标就是我们需要的最终文件,也是make的最终输出 Makefile的运行机制是:先将目标当成文件,查看文件是否存在,如果存在且是最新,那么直接结束,如果文件不存在 ...

  10. 基于Python爬虫采集天气网实时信息

      相信小伙伴们都知道今冬以来范围最广.持续时间最长.影响最重的一场低温雨雪冰冻天气过程正在进行中.预计,今天安徽.江苏.浙江.湖北.湖南等地有暴雪,局地大暴雪,新增积雪深度4-8厘米,局地可达10- ...