多数大学生出来选择的工作和专业无关
首页 > 专业知识

快速掌握PHP检查语法错误技巧

时间:2018-10-27 17:19:34 [来源]:郑州PHP培训学校

   快速掌握PHP检查语法错误技巧

  PHP检查语法错误的实现可以帮助我们节约许多编程中的时间,提高代码编程的可靠性和高性能。之前在当当的时候的一个项目中用到了一个简单的模板引擎,其实也是借鉴discuz来做的模板引擎,很简单,它所作的事情
  已经说了很简单了,所以编译的时候也名优进行模板语法的检查,那么在开发过程中就会出现编译出来的PHP文件有语法问题,有语法问题没有关系,我修改重新编译一下就好了。
  首先不能在每次请求的时候都把PHP模板重新编译一下,会严重影响性能,折中的处理时在每个编译好的PHP文件末尾检查一下该模板文件是否已经修改过,根据设定的更新频率,如果又需要则重新编译模板文件,现在的问题是编译出来的PHP文件自己有语法错误,根本执行不到模板检查那一步,所以即使修改了模板文件中的问题也不会重新编译。 所以我想寻找一种简单的方法来检查生成的PHP文件是否合法。不合法就重新编译,这样开发过程中就不用出现错误就得手动删除缓存文件了。
  在网上找了一下。刚开始以为 token_get_all()函数能处理PHP检查语法错误的问题,结果发现,它只是做简单的词法分析。没有办法。后来到论坛上去问了一下,有人告诉我有这样一个函数 PHP_check_syntax() http://www.PHP.net/manual/en/function.PHP-check-syntax.PHP 我想问题就这么坚决了。。我真应该RTF(Read The Fuck Mannual). 仔细一看。这个函数已近被弃用了:
  Note: For technical reasons, this function is deprecated and removed from PHP. Instead, use PHP -l somefile.PHP from the commandline.
  这个technical reason 到底是什么呢? 先不管了,以后再慢慢研究,反正不能使用这个方法就对了。
  他们的建议是使用命令行$PHP -l filename.PHP 来检查语法。
  Gary Every给了我一个代码片段参考:
  在命令行下检查问题也不大。如果我要放在在线应用呢? 这就涉及到可移植性的问题了。首先是操作系统,然后就是环境变量。这样的话就会依赖于服务器端的配置。在http://www.PHP.net/manual/en/function.PHP-check-syntax.PHP 上有人贴出了自己的PHP_check_syntax()函数实现。
  有的采用的就是上面的命令行的PHP检查语法错误方法。
  后面有提到使用eval的方法来验证。eval方法会执行传入的代码, 如果代码有语法错误则会抛出parser error, 可以使用’@'错误抑制符去掉错误信息,eval和echo一样并不是函数,不能使用变量函数的方法调用比如:
  $func = ‘eval’
  $func()这样的调用就是无效的。它会提示没有eval函数,如果你自己定义这么一个函数也是有问题的。因为eval是一个关键字。
  eval调用和include差不多,如果被包含文件中没有明确return就返回null。如果直接eval我们需要检查的文件会造成被检查的文件内代码被执行,这可不是我们想要的,我们只需要检查一下这个文件的语法是否正确。 我们可以在要检查的文件之前添加return 语句,让代码提前跳出,那么后面的代码就不会执行了。好的,就这么干
  < ?PHP
  if(!function_exists('PHP_check_syntax')) {
  function PHP_check_syntax($file_name,
  &$error_message = null) {
  $file_content = file_get_contents($file_name);
  $check_code = "return true; ?>";
  $file_content = $check_code .
  $file_content . "< ?PHP ";
  if(!@eval($file_content)) {
  $error_message = "file: " .
  realpath($file_name) . " have syntax error";
  return false;
  }
  return true;
  }
  }
  if(!PHP_check_syntax("file.PHP", $msg)) {
  echo $msg;
  }
  else {
  echo "Woohoo, OK!";
  }
  < ?PHP
  foreach:: a => b
  ?>
  因为Parse error 是没法被 set_error_handler处理函数处理的。这个异常没办法catch到。所以才使用了@来抑制错误。这带来的问题就是我们无法得到详细的错误信息。 不过目前我需要的功能也只是检查语法是否正确。不正确的话重新编译模板文件,就这么简单,至于语法错误,在显示网页的时候自然会看得到。
  PHP检查语法错误最好的办法就是这个被遗弃的PHP_check_syntax这个方法回到PHP中。下次再研究下他们是出于什么原因把这个函数去掉的。
  PHP调用Java语言的方法
  PHP是一个功能强大的HTML脚本语言。Java同样也是一个强大的计算机语言。那么二者能同时使用吗?今天我们就向大家介绍PHP调用Java语言的两种方法:一种是使用php中的Java扩展模块,另一种是使用minij2ee应用服务器提供的SJOP协议实现。下面我们来比较一下这两种方法各自的特点。
  PHP调用Java语言一.php的Java模块
  php发布版中包含一个Java扩展模块,可以用来调用Java对象,例如:
  < ?php
  $system=new Java("java.lang.System");
  print "Java version=".$system->
  getProperty("java.version")."
  <br>/n";
  ?>
  使用这种方法的优点是比较方便,只要用new Java()来创建一个Java对象,就可以同php类一样来调用Java对象。但是这种方法也有以下明显的缺点:
  1.由于php的Java模块根据php的数据类型选择最适合的Java方法,因此无法调用Java过载的函数。
  2.php的Java模块将在当前Web Server的进程中载入JVM(Java虚拟机),因此系统开销极大,影响Web Server进程的执行效率。
  3.在某些操作系统和Web Server环境中,php的Java模块将使Web Server进程僵死。
  由于这些原因,php的Java模块一直无法应用到实际的的软件系统中。---www.002pc.com
  PHP调用Java语言二.minij2ee应用服务器SJOP协议实现
  在介绍minij2ee应用服务器SJOP协议实现之前,先简单介绍一下minij2ee应用服务器。minij2ee应用服务器是第一款支持php的J2EE应用服务器产品,使php能够用于开发企业级应用系统。SJOP全称是Sample Java ORB Protocol(简单Java对象请求代理协议),是一种简单高效的对象请求代理协议。比如:
  < ?php
  $conn=minij2ee_fetch_connection();
  print "Java version=".minij2ee_
  callstatic_javaobj($conn,"java.lang.
  System","getProperty","java.lang.
  String","java.version")."
  <br>/n";
  ?>
  minij2ee应用服务器实现SJOP协议的主要目的是使php中能够访问EJB企业级组件,因此minij2ee提供了一个EJB-PHP编译器,可以把EJB组件编译成php的类,使php程序中能够方便的调用EJB组件,例如:
  < ?php
  require("Cart.php");
  file://Cart.php是编译Cart
  EJB后生成的Cart EJB的php类定义。
  $home=new CartHome();
  file://创建EJB的Home接口。
  $objref=$home->create($cart_name);
  file://创建Cart EJB。
  $cart=new Cart($objref);$cart->add("some goods");
  file://向购物车中添加一个物品。
  ?>
  使用minij2ee应用服务器的PHP调用Java语言方法,就可以开发出基于php和J2EE技术的,面向对象的,稳定高效的企业级应用系统。
 

上一篇:PHP中接收复选框信息的方法

下一篇:实用PHP组件及教程10则有哪些