PHP面试小结(20240108)

PHP 部分


1. php的包管理工具是如何实现自动加载的

换句话问:composer 实现原理是什么?spl_autoload_register()

首先,Composer 是 PHP 的一个包管理和包依赖管理的工具 ,

打开安装之后生成的 "vendor" 文件, 里面有个 "autoload.php" 文件. 只要引入这个文件, 所有通过 Composer 安装的类库就会全部加载完成:

require(__DIR__.'/vendor/autoload.php');

如果以后需要新增类库

  • 第一种方法: 使用命令 composer require, 比如 composer require phpunit/phpunit:~5.7, 比如 composer require twbs/bootstrap:4.0.0-beta.3;
  • 第二种方法: 在 "composer.json" 文件中追加, 然后执行 composer update;                执行 composer update, 将会升级 composer.json 中所有可升级的类库, 并自动更新升级其依赖. 这将引发一种问题 -- 某些类库尽管不是最新版本, 但是运行很正常很稳定, 我们并不需要更新他们. 如果使用"全部更新", 会自动将这些运行稳定的旧版本类库升级到最新版本, 却可能引入新的 Bug 和不确定性, 因此推荐使用"指定更新", 慎用"全部更新"
{"require":{"cebe/markdown":"1.1.1","phpunit/phpunit":"5.7.5"}
}

composer install:根据composer.lock安装依赖包(如果存在),否则根据composer.json

composer update:根据composer.json更新依赖到指定范围内最新版,并更新composer.lock文件

链接:https://www.jianshu.com/p/5954fe55d067

composer 使用细则_composer 版本规则-CSDN博客

详解composer的自动加载机制-CSDN博客

1.1 补充:PHP 的自动加载机制

PHP 的自动加载机制允许在代码中使用类时,不用显式地包含这些类的文件。相反,PHP 根据一组规则来查找相关的文件并自动加载它们。

以下是 PHP 自动加载机制的原理:

1、注册自动加载函数
通过 spl_autoload_register() 函数注册一个或多个自动加载函数。每当代码需要使用一个尚未定义的类或接口时,PHP 就会按照注册的顺序依次调用这些自动加载函数,直到找到定义文件为止。

2、根据类名或接口名生成文件路径
自动加载函数会根据类名或接口名来生成对应的文件路径,例如:类名 MyClass 可能对应的文件路径是 /path/to/project/src/MyClass.php,接口名 MyInterface 可能对应的文件路径是 /path/to/project/src/MyInterface.php。

3、加载文件并定义类或接口
如果文件存在,自动加载函数会通过 require_once 或 include_once 等函数将文件加载到内存中,并定义其中的类或接口。

以下是一个实现自动加载的示例:

function my_autoloader($class) {include 'classes/' . $class . '.class.php';
}spl_autoload_register('my_autoloader');

以上代码定义了一个名为 my_autoloader() 的自动加载函数。该函数会在 classes/ 目录下查找与 $class 参数对应的类文件,并包含进来。然后,通过 spl_autoload_register() 函数将该自动加载函数注册到 PHP 自动加载机制中。

使用 PHP 自动加载机制可以让开发者更加方便地编写和组织代码,避免了手工包含类文件的繁琐过程。

PHP 的自动加载机制_php 自动加载-CSDN博客

2.PHP怎么动态调用类中的方法
方法一:反射机制

在 PHP 中,可以使用反射机制来动态地调用类中的方法。下面是一种常见的方式

// 定义一个示例类
class MyClass {public function myMethod($param) {echo "Hello, $param!";}
}// 创建对象并获取其类名称
$obj = new MyClass();
$className = get_class($obj);// 通过反射获取类的信息
$reflectionClass = new ReflectionClass($className);// 判断要调用的方法是否存在于该类中
if ($reflectionClass->hasMethod('myMethod')) {// 获取方法的引用$methodReflector = $reflectionClass->getMethod('myMethod');// 设置方法为公共(如果需要)if (!$methodReflector->isPublic()) {$methodReflector->setAccessible(true);}// 传递参数并调用方法$params = ['John'];$result = $methodReflector->invokeArgs($obj, $params);// 输出结果var_dump($result); //Hello, John!
} else {echo 'The method does not exist.';
}// 这段代码首先创建了一个 MyClass 类,然后通过反射获取到该类的信息。
// 接着,我们判断要调用的方法是否存在于该类中,若存在则获取方法的引用。最后,我们将参数传递给方法进行调用,并打印出返回值。
<?php
class HelloWorld
{public function sayHelloTo($name){return 'Hello ' . $name;}
}
$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invokeArgs(new HelloWorld(), array('Mike-2222')); //结果: Hello  Mike-2222
方法二: call_user_func函数

PHP中提供了call_user_func函数用于动态调用类方法。

call_user_func(array($object, $methodName), $arg1, $arg2, ...)

其中,$object为类的实例化对象,$methodName为要调用的方法名,$arg1, $arg2, ...为方法所需要的参数。

示例代码:

class User {public function getName($id){return "name".$id;}
}$user = new User();
$name = call_user_func(array($user, 'getName'), 100);
echo $name;

输出结果:

name100
方法三: 使用call_user_func_array函数

call_user_func函数类似,PHP中也提供了call_user_func_array函数用于动态调用类方法,并且可以通过一个数组来传递参数。

call_user_func_array(array($object, $methodName), $arguments)

其中,$object为类的实例化对象,$methodName为要调用的方法名,$arguments为一个数组,包含方法所需要的参数。

示例代码:

class User {public function getName($id, $type){return "name".$id."-".$type;}
}$user = new User();
$name = call_user_func_array(array($user, 'getName'), array(100, 'vip'));
echo $name;

输出结果:

name100-vip
方法四: 使用可变函数名称

PHP中一个较为简单的方法是使用可变函数名称来动态调用类方法。

$object->$methodName($arg1, $arg2, …)

其中,$object为类的实例化对象,$methodName为要调用的方法名称,$arg1, $arg2, …为方法所需要的参数。

示例代码:

class User {public function getName($id){return "name".$id;}
}$user = new User();
$name = $user->getName(100);
echo $name;

输出结果:

name100
总结

以上介绍了三种动态调用类方法的方法,分别使用call_user_funccall_user_func_array以及可变函数名称。在实际开发中,我们可以根据具体的情况来选择不同的方法。

注意,动态调用类方法可能会导致一些安全问题,特别是在接收外部参数时,务必要进行安全过滤。

参考:https://imangodoc.com/7pRurY5o.html

3.self,this 有什么区别
4.MySQL中查询逗号拼接的字段(有个字段值保存的是用逗号拼接的用户ID)
5.反射有什么用处
6.什么是单点登录,实现的核心点(站在前后端的角度)

1、门面使用

2、mysql主从同步,主从延迟问题

3.   redis主从复制,redis默认使用哪个库,其中一个库满了如何切换到另外一个库

4.负载均衡: iphash文件怎么配置

5.锁 如何添加

6.堆,栈介绍

Linux: 

1.查看进程启动目录

2.环境变量怎么配置

3.定时任务怎么查看和配置

4.在Linux上如何把一个PHP脚本使用守护京城的方式运行

5.运行命令是后面的> 和 >> 表示什么意思

6.手写lru 算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343844.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 EmbeddingBag 和 Embedding 完成词嵌入

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客\n&#x1f366; 参考文章&#xff1a;365天深度学习训练营\n&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.co…

【MIdjourney】关于图像中人物视角的关键词

本篇仅是我个人在使用过程中的一些经验之谈&#xff0c;不代表一定是对的&#xff0c;如有任何问题欢迎在评论区指正&#xff0c;如有补充也欢迎在评论区留言。 1.全景镜头(panorama) 全景镜头是一种广角镜头&#xff0c;可以捕捉到比普通镜头更广阔的视野范围。全景镜头&…

挑选富集分析结果 enrichments

#2.2挑选term---selected_clusterenrichenrichmets[grepl(pattern "cilium|matrix|excular|BMP|inflamm|development|muscle|vaso|pulmonary|alveoli",x enrichmets$Description),]head(selected_clusterenrich) distinct(selected_clusterenrich)# remove duplica…

2024.1.11 关于 Jedis 库操作 Redis 基本演示

目录 引言 通用命令 SET & GET EXISTS & DEL KEYS EXPIRE & TTL TYPE String 类型命令 MGET & MSET GETRANGE & SETRANGE APPEND INCR & DECR List 类型命令 LPUSH & LRANG LPOP & LPOP BLPOP & BRPOP LLEN Set 类型命…

自动化测试数据校验神器!

在做接口自动化测试时&#xff0c;经常需要从接口响应返回体中提取指定数据进行断言校验。 今天给大家推荐一款json数据提取神器: jsonpath jsonpath和常规的json有哪些区别呢&#xff1f;在Python中&#xff0c;json是用于处理JSON数据的内置模块&#xff0c;而jsonpath是用…

给定n个字符串s[1...n], 求有多少个数对(i, j), 满足i < j 且 s[i] + s[j] == s[j] + s[i]?

题目 思路&#xff1a; 对于字符串a&#xff0c;b, (a.size() < b.size()), 考虑对字符串b满足什么条件&#xff1a; 由1、3可知a是b的前后缀&#xff0c;由2知b有一个周期是3&#xff0c;即a.size()&#xff0c;所以b是用多个a拼接而成的&#xff0c;有因为a是b的前后缀&…

C++每日一练(15):简单幂计算

题目描述 输入两个数a和b&#xff0c;求a的b次方。 输入 输入两个整数a&#xff0c;b&#xff08;1<a<10&#xff0c;1<b<15&#xff09;。 输出 输出一个正整数&#xff0c;该值<1000000000000。 输入样例 3 3 输出样例 27 参考答案 #include<bits/stdc.h&…

87.乐理基础-记号篇-反复记号(一)反复、跳房子

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;86.乐理基础-记号篇-速度记号-CSDN博客 首先是反复记号表总结图&#xff1a; 当前是写前两个记号&#xff0c;其余记号后面写&#xff1a;这些反复记号最主要的目的很简单&#xff0c;还是为了节约纸张&#xff0c…

GPT Store,是否会成为下一个App Store?

经历了一场风波后&#xff0c;原本计划推出的GPT Store终于成功上线。OpenAI在北京时间1月11日推出了GPT Store&#xff0c;被广泛视为类似于苹果的"App Store"&#xff0c;为人工智能应用生态系统迈出了重要一步。然而&#xff0c;OpenAI要想将GPT Store打造成苹果般…

写在学习webkit过程的前面

webkit起源于KHTML&#xff0c;是KDE开源项目的KHTML和KJS引擎的一部分。在它的诞生和发展过程中&#xff0c;由两家著名的公司参与开发过程中&#xff0c;造成两次裂变。诞生两个内核webkit和blink&#xff0c;并发展和产生了两个主流的浏览器&#xff0c;分别为safari和chrom…

Nginx——基础配置

和大多数软件一样&#xff0c;Nginx也有自己的配置文件&#xff0c;但它又有很多与众不同的地方&#xff0c;本帖就来揭开Nginx基础配置的面纱。 1、Nginx指令和指令块 了解指令和指令块有助于大家了解配置的上下文&#xff0c;下面是一个配置模板示例&#xff1a; 在这个配…

搭建LNMP网站平台并部署Web应用

本章主要介绍&#xff1a; 安装Nginx安装MySQL安装PHP在LNMP平台中部署 Web 应用 构建LNMP网站平台就像构建LAMP平台一样&#xff0c;构建LNMP平台也需要Linux服务器&#xff0c;MySQL数据库&#xff0c;PHP解析环境&#xff0c;区别主要在Nginx 与 PHP的协作配置上&#xff0…