GVKun编程网logo

thinkPHP线上自动加载异常与修复方法实例分析(thinkphp自动加载原理)

14

最近很多小伙伴都在问thinkPHP线上自动加载异常与修复方法实例分析和thinkphp自动加载原理这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展PHP自动加载类原理与用法实例分

最近很多小伙伴都在问thinkPHP线上自动加载异常与修复方法实例分析thinkphp自动加载原理这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展PHP 自动加载类原理与用法实例分析、PHP类的自动加载与命名空间用法实例分析、PHP编程:thinkPHP5.0框架自动加载机制分析、PHP编程:ThinkPHP表单数据智能写入create方法实例分析等相关知识,下面开始了哦!

本文目录一览:

thinkPHP线上自动加载异常与修复方法实例分析(thinkphp自动加载原理)

thinkPHP线上自动加载异常与修复方法实例分析(thinkphp自动加载原理)

本文实例讲述了thinkPHP线上自动加载异常与修复方法。分享给大家供大家参考,具体如下:

项目遇到一个奇怪的问题,本地代码正常,服务器上却不正常。

经过测试,应该是自动加载出了问题,尝试了各种方法,

1.手动加载,发现好麻烦,没完没了。

2.自己写自动加载,写不出来,尴尬。

3.修改配置,使其支持自动加载,发现还是不行。

后来进行调试,

发现本地支持

rush:PHP;"> import('@.ORG.OSS\OssClient'); import('@.ORG.OSS\Core\OssUtil');

而服务器上,不支持这种斜杠的方式,却支持.的方式

后来就把thinkPHP核心代码,进行调整。

rush:PHP;"> // 根据自动加载路径设置进行尝试搜索 $paths = explode(',',C('APP_AUTOLOAD_PATH')); foreach ($paths as $path){ $class = str_replace("\\",".",$class); // dump($class); if(import($path.'.'.$class)){ // dump($path.'.'.$class); // 如果加载类成功则返回 return ; } }

经过这个小小的动作,可以了,服务器可以使用OSS了。

不容易啊!

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 自动加载类原理与用法实例分析

PHP 自动加载类原理与用法实例分析

本文实例讲述了PHP 自动加载类原理与用法。分享给大家供大家参考,具体如下:

类的自动加载 (Autoloading Classes)

在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。

在 PHP 5 中,已经不再需要这样了。 spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

Tip

尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_register() 函数。spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。

Note:

在 PHP 5.3 之前,__autoload 函数抛出的异常不能被 catch 语句块捕获并会导致一个致命错误(Fatal Error)。 自 PHP 5.3 起,能够 thrown 自定义的异常(Exception),随后自定义异常类即可使用。 __autoload 函数可以递归的自动加载自定义异常类。

Note:

自动加载不可用于 PHP 的 CLI 交互模式。

Note:

如果类名比如被用于 call_user_func(),则它可能包含一些危险的字符,比如 ../。 建议您在这样的函数中不要使用用户的输入,起码需要在 __autoload() 时验证下输入。

自动加载示例

ClassInterface.php

<?php
interface ClassInterface {
  public function print();
  public function get_current_time();
}

MyClass1.php

<?php
class MyClass1 implements ClassInterface
{
  public $flag = ''MyClass1'';

  public function print() {
    echo $this->flag;
  }

  public function get_current_time() {
    echo $this->flag . " : " . date("Y-m-d H:i:s",time());
  }
  
}

MyClass2.php

<?php
class MyClass2 implements ClassInterface
{
  public $flag = ''MyClass2'';

  public function print() {
    echo "MyClass2";
  }

  public function get_current_time() {
    echo $this->flag . " : " . date("Y-m-d H:i:s",time());
  }
  
}

autoload.php

<?php
date_default_timezone_set(''Asia/Shanghai'');
spl_autoload_register(function ($class_name) {
  require_once $class_name . ''.php'';
});

$obj = new MyClass1();
$obj2 = new MyClass2();
$obj->print();
echo "<br>";
$obj->get_current_time();
echo "<br>";
$obj2->print();
echo "<br>";
$obj2->get_current_time();

 输出结果:

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:
  • php自动加载代码实例详解
  • php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
  • PHP类的自动加载与命名空间用法实例分析
  • PHP 命名空间和自动加载原理与用法实例分析
  • PHP实现自动加载机制

PHP类的自动加载与命名空间用法实例分析

PHP类的自动加载与命名空间用法实例分析

本文实例讲述了PHP类的自动加载与命名空间用法。分享给大家供大家参考,具体如下:

作为一名合格的程序员,必定会有一个从面向过程编程到面向对象编程的转化过程,在这个过程中诸如命名空间,类,继承,接口,类自动加载等等都是需要我们去掌握的,之前对这些概念都不是很熟悉,只是能够基础地使用,在这里系统的记录一下关于命名空间与类的自动加载知识。

类的自动加载

什么是自动加载类?

? ? 从字面意思上就可以大概知道,当调用一个当前页面未定义的类的时候能够自动加载。
相信如果你之前了解过php的魔术方法的话,肯定不会对__autoload这个魔术方法感到陌生。php官方手册解释:尝试加载未定义的类

void __autoload ( string $class )

class即为待加载的类名。php官方手册也有比较好的例子,这里引用一下:

./myClass.php

<?php
//在这里定义一个构造方法
class myClass {
 public function __construct() {
  echo "myClass init''ed successfuly!!!";
 }
}
?>

./index.php

<?php
// 将这些代码写在我们需要用到的地方
function __autoload($classname) {
 $filename = "./". $classname .".php";
 include_once($filename);
}

// 实例化一个类
$obj = new myClass();
?>

"在这一行,我们的"./myClass.php"会被包含进来,这个神奇效果正是我们想要的 你将会得到"myClass init''ed successfuly!!!"的返回结果.

所以,如果你调用了一个类似于"myClass"的类,文件将会包含"myClass.php",前提是该文件存在(如果不存在你将会得到一个引用错误),如果你调用了"Foo","Foo.php"会被引用,诸如此类...

你在也不需要像下面这样写了。"

<?php
include_once("./myClass.php");
include_once("./myFoo.php");
include_once("./myBar.php");

$obj = new myClass();
$foo = new Foo();
$bar = new Bar();
?>

虽然说这个魔术方法确实很magic,但是他有一个缺点,那就是只能使用一次,当需要多条 autoload 函数的时候就不行了,所以官方不推荐使用,在后续版本可能会被移除。同时官方也给出了可以替代的函数spl_autoload_register,将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

直接用例子在说明吧,这里与命名空间一起讲:

#新建工程test

//首先新建应用目录app,然后在目录下新建一个Test文件夹,文件夹下新建两个类

test/app/Test/Beta.php

<?php
namespace app\Test;
class Beta {
 public function index() {
  echo "app\Test\Beta\index";
 }
}

test/app/Test/Test.php

<?php
namespace app\Test;
class Test {
 public function index() {
  echo "app\Test\Test\index";
 }
}

//新建自动加载类
test/app/autoload/Loading.php

<?php
namespace app\autoload
class Loading {
 public static function autoLoad() {
 //把 \ 转换层 / , 便于兼容Linux文件找。Windows 下是通用的
  $fileName = str_replace(''\\'', ''/'', DIR . ''\\''. $className) . ''.php'';
  if (is_file($fileName)) {
   require_once $fileName;
  } else {
   echo $fileName . '' is not exist''; die;
  }
 }
}

//新建应用入口文件
test/index.php

define(''DIR'', dirname(__FILE__));// /.../test
//引入自动加载文件
require DIR . "/autoload/Loading.php";
//自动注册
//这里就是为什么前面写成静态方法的原因
spl_autoload_register("\\autoload\\Loading::autoLoad");
//然后在下面就可以直接调用类了,只要在前面加上命名空间
$beta = new app\Test\Beta();
$beta->index();//输出 app\Test\Beta\index
echo "\r\n";
$test = new app\Test\Test();
$test->index(); //输出 app\Test\Test\index

命名空间

看到这里相信你应该已经对命名空间有了一个大致的了解,起码知道怎么用。

什么是命名空间?

从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

所以你可以将他理解为:文件夹。。。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:
  • PHP命名空间实现自动加载引入文件
  • 如何理解PHP核心特性命名空间
  • 详解PHP中的命名空间
  • 详细分析PHP 命名空间(namespace)
  • PHP 命名空间和自动加载原理与用法实例分析
  • PHP 命名空间原理与用法详解
  • PHP命名空间(namespace)原理与用法详解
  • php 命名空间(namespace)原理与用法实例小结
  • php命名空间举例介绍使用方法

PHP编程:thinkPHP5.0框架自动加载机制分析

PHP编程:thinkPHP5.0框架自动加载机制分析

《thinkPHP5.0框架自动加载机制分析》要点:
本文介绍了thinkPHP5.0框架自动加载机制分析,希望对您有用。如果有疑问,可以联系我们。

本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下:PHP编程

概述PHP编程

ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载.PHP编程

自动加载的实现由think\Loader类库完成,自动加载规范符合PHP的PSR-4.PHP编程

自动加载PHP编程

由于新版ThinkPHP完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载.PHP编程

类库的自动加载检测顺序如下:PHP编程

1、类库映射检测;
2、PSR-4自动加载检测;
3、PSR-0自动加载检测;PHP编程

系统会按顺序检测,一旦检测生效的话,就会自动载入对应的类库文件.PHP编程

类库映射PHP编程

遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射.命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效,例如:PHP编程

Loader::addClassMap('think\Log',LIB_PATH.'think\Log.PHP');
Loader::addClassMap('org\util\Array',LIB_PATH.'org\util\Array.PHP');

也可以利用addClassMap方法批量导入类库映射定义,例如:PHP编程

$map = [
  'think\Log'   => LIB_PATH.'think\Log.PHP','org\util\array'=> LIB_PATH.'org\util\Array.PHP'
];
Loader::addClassMap($map);

虽然通过类库映射的方式注册的类可以不强制要求对应命名空间目录,但是仍然建议遵循PSR-4规范定义类库和目录.PHP编程

类库导入PHP编程

如果你不需要系统的自动加载功能,又或者没有使用命名空间的话,那么也可以使用think\Loader类的import方法手动加载类库文件,例如:PHP编程

Loader::import('org.util.array');
Loader::import('@.util.upload');

示例PHP编程

// 引入 extends/qrcode.PHP
Loader::import('qrcode',EXTEND_PATH);
// 助手函数
import('qrcode',EXTEND_PATH);
// 引入 extends/wechat-sdk/wechat.class.PHP
Loader::import('wechat-sdk.wechat',EXTEND_PATH,'.class.PHP');
// 助手函数
import('wechat-sdk.wechat','.class.PHP');

类库导入也采用类似命名空间的概念(但不需要实际的命名空间支持),支持的“根命名空间”包括:PHP编程


如果完全遵从系统的命名空间定义的话,一般来说无需手动加载类库文件,直接实例化即可.PHP编程

Composer自动加载PHP编程

5.0版本支持Composer安装的类库的自动加载,你可以直接按照Composer依赖库中的命名空间直接调用.PHP编程

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》、《smarty模板入门基础教程》及《PHP模板技术总结》.PHP编程

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助.PHP编程

PHP编程:ThinkPHP表单数据智能写入create方法实例分析

PHP编程:ThinkPHP表单数据智能写入create方法实例分析

《ThinkPHP表单数据智能写入create方法实例分析》要点:
本文介绍了ThinkPHP表单数据智能写入create方法实例分析,希望对您有用。如果有疑问,可以联系我们。

本文实例讲述了ThinkPHP表单数据智能写入create办法.分享给大家供大家参考.具体如下:PHP教程

创建数据对象 create()PHP教程

除了手动构造入库的数据集之外,ThinkPHP 还提供了自动创建数据对象的 create() 办法.create() 办法将自动收集提交的表单数据并创建数据对象而无需人工干预,这在表单数据字段非常多的情况下更具优势.PHP教程

将前文写入表单数据的例子用 create() 来实现:PHP教程

public function insert2(){
 header("Content-Type:text/html; charset=utf-8");
 $Dao = M("User");
 if($Dao->create()){
  $Dao->password = md5($_POST["password"]);
  $Dao->regdate = time();
  if($lastInsId = $Dao->add()){
   echo "插入数据 id 为:$lastInsId";
  } else {
   echo "数据写入错误!";
  }
 }else{
  exit($Dao->getError().' [ <a href="history.back()">返 回</a> ]');
 }
}

create() 创建数据对象后,将自动收集提交过来的表单数据.而表单数据可能需要经过一定加工(例如将暗码加密)才能写入数据表,所以可以对数据对象的成员属性值根据进行修改或添加去除等.PHP教程

提示:create() 创建的数据对象存放于内存,在执行入库动作(add() 或 save())之前,都可以进行修改.PHP教程

在上面的例子里,create()办法 的行为和 date()办法 是一致.但 date() 办法只是简单的创建数据对象,但 create() 办法还具备:PHP教程

① 令牌验证
② 数据自动验证
③ 字段映射支持
④ 字段类型检查
⑤ 数据自动完成PHP教程

等各种高级的数据功能,要完成这些高级数据模型功能,需要使用 D办法 实例化数据模型.ThinkPHP 提供了各种验证与填充规则供调用,具体可参见《ThinkPHP 自动验证》与《ThinkPHP 自动填充》相关文章.PHP教程

自动验证与自动填充PHP教程

在将表单写入数据表之前,常常会有一些对数据的检测(提交的用户名是否符合要求)与处理(如例子中的暗码加密以及取得当前时间戳).create() 方法就支持数据的自动验证与自动完成.PHP教程

在 libmodel 目录下创建 usermodel.class.PHP 文件(User 为创建的模型对象,也对应 前缀_user 表),加入自动验证和自动填充规则:PHP教程

class usermodel extends Model{
 // 自动验证设置
 protected $_validate = array(
  array('username','require','用户名必须填写!',1),array('email','email','邮箱格式错误!',2),array('username','','用户名已经存在!','unique',);
 //自动填充设置
 protected $_auto = array(
  array('regdate','time',self::MODEL_INSERT,'function'),array('password','md5',);
}

将 insert2 操作更改为:PHP教程

public function insert2(){
 header("Content-Type:text/html; charset=utf-8");
 $Dao = D("User");
 if($Dao->create()){
  if($lastInsId = $Dao->add()){
   echo "插入数据 id 为:$lastInsId";
  } else {
   echo "数据写入错误!";
  }
 }else{
  exit($Dao->getError().' [ <a href="history.back()">返 回</a> ]');
 }
}

如果提交的数据不符合验证要求(如用户名存在),则 create() 创建数据对象失败(返回 FALSE ),$Dao->getError() 会打印出自动验证设置规则里面设置的提示信息:用户名已经存在!PHP教程

如果验证规则通过后,系统会进行自动填充设置,将表单暗码进行 MD5 加密以及取得当前的时间戳填充入 create() 的数据对象.PHP教程

所以 D办法 配合 create() 是非常智能而强大的,恰当运用可以达到事半功倍快速开发的目的.PHP教程

提示:PHP教程

① D 办法配合 create() 由于其功能强大,也就损失了一定的效率,在业务逻辑不复杂的情况下推荐 M办法+data() 模式PHP教程

② create() 默认接受 POST 数据,若要接受其他类型数据,只需在参数内指定即可,如接受 GET 数据:create($_GET)PHP教程

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》及《ThinkPHP常用办法总结》PHP教程

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所赞助.PHP教程

欢迎参与《ThinkPHP表单数据智能写入create方法实例分析》讨论,分享您的想法,小编 jb51.cc为您提供专业教程。

今天的关于thinkPHP线上自动加载异常与修复方法实例分析thinkphp自动加载原理的分享已经结束,谢谢您的关注,如果想了解更多关于PHP 自动加载类原理与用法实例分析、PHP类的自动加载与命名空间用法实例分析、PHP编程:thinkPHP5.0框架自动加载机制分析、PHP编程:ThinkPHP表单数据智能写入create方法实例分析的相关知识,请在本站进行查询。

本文标签:

上一篇thinkPHP订单数字提醒功能的实现方法(thinkphp订单打印)

下一篇thinkPHP模板中函数的使用方法示例(thinkphp常用函数)