php的应用场景?php单例模式应用场景
大家好,今天给各位分享php的应用场景的一些知识,其中也会对php单例模式应用场景进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
PHP单例模式应用场景有哪些
单例模式的要点有三个:
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
复制代码代码如下:
<?php
/*单例模式举例,其要点如下:
*
* 1.$_instance必须声明为静态的私有变量
* 2.构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new类从而失去单例模式的意义
* 3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用
* 4.::操作符只能访问静态变量或静态函数
* 5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。
*也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,
*还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。
*不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复
* new对象(注: new对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的
*
*/
class People
{
static private$_instance= NULL;
public$height='';
public$age='';
private function __construct()
{
$this->height='185';
$this->age= 25;
}
private function __clone()
{
//do something
}
static public function getInstance()
{
if(!self::$_instance instanceof self)
{
//echo'lgh-big';
self::$_instance= new self;
}
else
{
//for testing only
//echo'gdc-xiaoairener';
}
return self::$_instance;
}
public function getHeight()
{
echo$this->height;
}
public function getAge()
{
echo$this->age;
}
}
function testInstance()
{
People::getInstance()->getAge();
}
//begin to use the class
$lgh= People::getInstance();
$lgh->getHeight();
echo'<br/>';
testInstance();
?>
优点:单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源
缺点:在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。
Why–为什么要使用PHP单例模式?
PHP的一个主要应用场合就是应用程序与数据库打交道的应用场景,所以一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。
还是有些抽象,给出代码片段。
使用传统方式编码
复制代码代码如下:
<?php
......
//初始化一个数据库句柄
$db= new DB(...);
//比如有个应用场景是添加一条用户信息:
$db->addUserInfo();
......
//然而我们在另外一个地方可能要查找用户的信息,这个情景出现在一个函数中,这时要用到数据库句柄资源,我们可能需要这么去做
......
function test(){
......
//这时我们不得不重新初始化一个数据库句柄,试想多个应用场景下,这样的代码是多么可怕啊?!
$db= new DB(...);
$db->getUserInfo();
......
//有些朋友或许会说,我也可以不这样做啊,我直接利用global关键字不就可以了吗?的确,global可以解决问题,也起到了单例模式的作用,但是OOP中,我们拒绝这样来编写代码,因为global存在安全隐患,请参考相关书籍,同时单例模式恰恰是对全局变量的一种改进,避免了那些存储唯一实例的全局变量污染命名空间
global$db;//OOP中,我们不提倡这样编写代码
......
}
使用单例模式编码
复制代码代码如下:
<?php
......
//所有的应用情景只有一个数据库句柄资源,嘿嘿,效率老高了,
//资源也大大的得到节省,代码简洁明了:)
DB::getInstance()->addUserInfo();
DB::getInstance()->getUserInfo();
......
How–如何来编写PHP单例模式?
在了解了单例模式的应用场景之后,下面我们通过编写单例模式的具体实现代码来掌握PHP单例模式的核心要点,代码如下:
复制代码代码如下:
<?php
/**
* PHP单例模式演示举例
*@author guohua.li
*@modify 2010-07-11
*@website
*/
class User{
/**
*静态成品变量保存全局实例
*@access private
*/
static private$_instance= NULL;
/**
*私有化构造函数,防止外界实例化对象
*/
private function __construct(){}
/**
*私有化克隆函数,防止外界克隆对象
*/
private function __clone(){}
/**
*静态方法,单例统一访问入口
*@return object返回对象的唯一实例
*/
static public function getInstance(){
if(is_null(self::$_instance)||!isset(self::$_instance)){
self::$_instance= new self();
}
return self::$_instance;
}
/**
*测试方法:获取用户名字
*/
public function getName(){
echo'hello liguohua!';
}
}
从以上代码中,我们总结出PHP单例模式实现的核心要点有如下三条:
1.需要一个保存类的唯一实例的静态成员变量(通常为$_instance私有变量)
2.构造函数和克隆函数必须声明为私有的,这是为了防止外部程序new类从而失去单例模式的意义
3.必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
PHP单例模式的缺点
众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。
php反射在哪些场景有哪些作用
反射是在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
php反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。
通过ReflectionClass,我们可以得到Person类的以下信息:
1)常量 Contants
2)属性 Property Names
3)方法 Method Names静态
4)属性 Static Properties
5)命名空间 Namespace
6)Person类是否为final或者abstract
然后就去看了看thinkphp的源码,对于MVC的实现也有不同的体验ThinkPHP\Lib\Core\App.class.php中的exec方法
if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
//非法操作
thrownewReflectionException();
}
//执行当前操作
$method=newReflectionMethod($module,$action);#查看方法
if($method->isPublic()){
$class=newReflectionClass($module);#反射控制器
//前置操作
if($class->hasMethod('_before_'.$action)){
$before=$class->getMethod('_before_'.$action);
if($before->isPublic()){
$before->invoke($module);
}
}
//URL参数绑定检测
if(C('URL_PARAMS_BIND')&&$method->getNumberOfParameters()>0){
switch($_SERVER['REQUEST_METHOD']){
case'POST':
$vars=$_POST;
break;
case'PUT':
parse_str(file_get_contents('php://input'),$vars);
break;
default:
$vars=$_GET;
}
$params=$method->getParameters();
foreach($paramsas$param){
$name=$param->getName();
if(isset($vars[$name])){
$args[]=$vars[$name];
}elseif($param->isDefaultValueAvailable()){
$args[]=$param->getDefaultValue();
}else{
throw_exception(L('_PARAM_ERROR_').':'.$name);
}
}
$method->invokeArgs($module,$args);
}else{
$method->invoke($module);#执行我们需要调用函数
}
//后置操作
if($class->hasMethod('_after_'.$action)){
$after=$class->getMethod('_after_'.$action);
if($after->isPublic()){
$after->invoke($module);
}
}
php要运行需要哪些环境
要运行PHP,需配置以下环境:
Web服务器
PHP作为服务器端脚本语言,必须部署在Web服务器上运行。常见选择包括Apache(开源、跨平台,支持模块化配置)、Nginx(轻量级、高并发处理能力强)和IIS(Windows系统专用)。这些服务器均支持Linux、Windows及macOS系统,需根据项目需求选择。例如,Apache的.htaccess文件可灵活配置URL重写规则,而Nginx更适合处理静态资源或反向代理场景。
PHP解释器
PHP代码需通过解释器转换为机器可执行指令。解释器有两种部署方式:
模块化集成:如Apache的mod_php模块,直接嵌入服务器进程,减少通信开销;独立进程模式:通过FastCGI(如PHP-FPM)与服务器通信,提升并发性能。
解释器版本需与项目兼容,例如PHP 8.x支持JIT编译,可显著提升计算密集型任务效率。数据库
PHP常与数据库交互以实现数据持久化。主流数据库包括:
MySQL:开源、社区生态完善,PHP通过mysqli或PDO扩展连接;PostgreSQL:支持复杂查询和事务,适合企业级应用;SQLite:轻量级嵌入式数据库,适用于小型项目。
需根据数据规模、事务需求及成本选择,并通过SQL语句或ORM框架(如Eloquent)操作数据。PHP扩展
扩展可增强PHP功能,例如:
数据库扩展:pdo_mysql、pgsql等支持不同数据库;图像处理:GD库或Imagick处理图片缩放、水印;加密安全:openssl扩展实现数据加密或HTTPS通信。
可通过php.ini配置文件启用扩展,或使用pecl命令动态安装。操作系统
PHP跨平台特性支持多系统部署:
Linux:主流生产环境选择,稳定性高且资源占用低;Windows:适合本地开发或IIS集成场景;macOS:开发者常用,便于与前端工具链协同。
需注意系统权限配置(如文件读写权限)及路径分隔符差异(Windows用,Linux/macOS用/)。开发工具
文本编辑器:如VS Code(轻量、插件丰富)、Sublime Text(快速启动);IDE:如PHPStorm(智能代码补全、调试工具)、Eclipse PDT(免费开源)。
工具选择影响开发效率,例如PHPStorm的Xdebug集成可快速定位代码错误。前端技术
PHP常与HTML(结构)、CSS(样式)、JavaScript(交互)结合,构建动态网页。例如,通过PHP生成JSON数据供前端Ajax请求,或使用模板引擎(如Twig)分离逻辑与表现层。熟悉前端框架(如Vue.js)可进一步提升应用交互性。
完整PHP运行环境需涵盖服务器、解释器、数据库、扩展、操作系统、开发工具及前端技术。实际配置时需权衡性能、成本及维护复杂度,例如小型项目可选Nginx+MySQL+Linux组合,而企业级应用可能需Apache+Oracle+Windows的冗余架构。
如果你还想了解更多这方面的信息,记得收藏关注本站。