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

PHP强制对象类型之instanceof操作符

时间:2018-03-13 17:39:51 [来源]:郑州PHP培训学校

   PHP强制对象类型之instanceof操作符

  在PHP中实现强制对象类型有时可能非常重要。如果缺少了它,或是因为缺乏这方面的知识——基于不正确的编程假设,或者仅仅是由于懒惰,那么你会在特定的Web应用程序中看到你所不希望的结果。特别是当用PHP 4进行编程时,使用"is_a()"函数(尽管还有其它方法)来验证你所使用的对象的类型是非常容易的事情。毫无疑问,强制对象类型还可以被用于过滤输入对象(需要被作为参数传递到同一个应用程序中的其它PHP类)。
  不过,PHP 4并没有暴露一些有关于它的对象模型的弱点-为了实现某些在成熟的面向对象的语言中出现的特征,它偶而可能要求编写另外的代码。长时间以来,这一事实已经为PHP社区众所周知。然而,随着PHP 5的发行,许多这些极有价值的特征作为改进的对象模型的一部分被添加到其中。它们将有助于更为紧密地实现基于对象的代码的开发-允许你使用特定的对象特征。
  在上面的情况下,当涉及到对象类型强制时应该特别注意。实际上,在一个Web应用程序的执行期间,PHP 5提供给开发者至少两种方法来检查对象类型——它们分别是“instanceof”操作符和“类型提示”特征。现在转到本文的主题,我将介绍PHP 5中"instanceof"操作符的使用;你很快就会发现,它可以非常方便地用来确定是否你正在使用的对象属于一个特定的类型。
  本文将通过一些面向对象的示例来帮助你理解如何在PHP 5中实现强制对象类型。
  二、 你不该做什么
  为了展示在PHP 5中如何实现对象类型强制,我将使用(X)HTML widget类,还有一个简单的页面生成器类,并作了简单的修改以适合PHP 5开发环境。
  我的第一个示例列举了一些派生自一个抽象的基类"HTMLElement"的(X)HTML widget类,它跳过了到它们的输入对象类型的检查。请先看下面的类:
  //定义抽象类'HTMLElement'
  abstract class HTMLElement{
  protected $attributes;
  protected function __construct($attributes){if(!is_array($attributes)){
  throw new Exception('Invalid attribute type');}
  $this->attributes=$attributes;
  }
  // 抽象的'getHTML()'方法
  abstract protected function getHTML();
  }
  //定义具体的类'Div'-扩展HTMLElement
  class Div extends HTMLElement{
  private $output='
  private $data;
  public function __construct($attributes=array(),$data){parent::__construct($attributes);
  $this->data=$data;
  }
  //'getHTML()'方法的具体实现
  public function getHTML(){
  foreach($this->attributes as $attribute=>$value){$this->output.=$attribute.'="'.$value.'" ';}
  $this->output=substr_replace($this->output,'>',-1);$this->output.=$this->data.'
  ';
  return $this->output;
  }
  }
  //定义具体类'Header1'-扩展HTMLElement
  class Header1 extends HTMLElement{
  private $output='
 
  PHP企业级应用之常见缓存技术篇
  别每天OO,这个配置怎么改,这段代码哪错了,没劲,好的程序不光是代码写的好,整体架构很重要,多了解程序之外的东西,这篇不再单单是程序方面的东西了,会写到从程序到服务器的设置,会比较多,但个人的经验有限,知道的就这么多,不知道的我也没法写呀, 文章说的不好大家就当我说梦话得了。
  所有程序例子都来自网络
  普遍缓存技术
  数据缓存:这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。
  用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。
  举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。
  页面缓存:
  每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)时间触发缓存:
  检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
  内容触发缓存:
  当插入数据或更新数据时,强制更新缓存。
  静态缓存
  这里所说的静态缓存是指静态化,直接生成HTML或XML等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。
  以上内容是代码级的解决方案,我直接CP别的框架,也懒得改,内容都差不多,很容易就做到,而且会几种方式一起用,但下面的内容是服务器端的缓存方案,非代码级的,要有多方的合作才能做到内存缓存:
  Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
  这里说下Memcached的例子
  <?php<br />$memcache = new Memcache;<br />$memcache->connect('localhost', 11211) or die ("Could not connect");<br />$version = $memcache->getVersion();<br />echo "Server's version: ".$version."\n";<br />$tmp_object = new stdClass;<br />$tmp_object->str_attr = 'test';<br />$tmp_object->int_attr = 123;<br />$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");<br />echo "Store data in the cache (data will expire in 10 seconds)\n";<br />$get_result = $memcache->get('key');<br />echo "Data from the cache:\n";<br />var_dump($get_result);<br />?>
  读库的例子
  <?php<br />$sql = 'SELECT * FROM users';<br />$key = md5($sql);   //memcached 对象标识符<br />if ( !($datas = $mc->get($key)) ) {<br />    //  在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。<br />    echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";<br />    $conn = mysql_connect('localhost', 'test', 'test');<br />    mysql_select_db('test');<br />    $result = mysql_query($sql);<br />    while ($row = mysql_fetch_object($result))<br />        $datas[] = $row;<br />    //  将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。<br />    $mc->add($key, $datas);<br />} else {<br />    echo "n".str_pad('Read datas from memcached.', 60, '_')."n";<br />}<br />var_dump($datas);<br />?>
  php的缓冲器:
  有eaccelerator,apc,phpa,xcache,这个这个就不说了吧,搜索一堆一堆的,自己看啦,知道有这玩意就OKMYSQL缓存:
  这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的我贴段根据蓝色那家伙修改后部分my.ini吧,2G的MYISAM表可以在0.05S左右,据说他前后改了有快一年[client]
  ……
  default-character-set=gbk
  default-storage-engine=MYISAM
  max_connections=600
  max_connect_errors=500
  back_log=200
  interactive_timeout=7200
  query_cache_size=64M
  ……
  table_cache=512
  ……
  myisam_max_sort_file_size=100G
  myisam_max_extra_sort_file_size=100G
  myisam_sort_buffer_size=128M
  key_buffer_size=1024M
  read_buffer_size=512M
  ……
  thread_concurrency=8
 
  PHPUnit袖珍指南之自动测试
  最好的程序员也会犯错误。好程序员和差程序员的区别在于:好程序员能通过测试尽可能的发现错误。你越快测试错误,你就越快发现它们,发现和修正的成本就越低。这解释了为什么只在软件发布前才测试的做法为什么问题那么多。大多数错误根本就没有发现过,修正发现的错误是那么的高,以至于你不得不根据优先级来决定只修正那些错误,因为你根本就承受不起全部修正的费用。
  相比你正在使用的方法,采用PHPUnit进行测试并不是一个全然不同的东西。它们只是方法不同。两者之间的不同在于,检查程序行为是否符合正确是通过一批可以自动测试的代码片断来进行的。这些代码片断叫做单元测试。 在这一部分,我们先基于打印的测试代码进行自动测试。假设我们要测试PHP的内建数组Array。需要测试之一是函数sizeof(),对任何新创建的数组,sizeof()函数应该返回 0。当我们加入一个新数组成员,sizeof()应该返回1。例1显示了我们想测试什么。
  例1. 测试数组和sizeof()
  $fixture = Array( );
  // $fixture应该为空。
  $fixture[] = "element";
  // $fixture应该包含一个数组成员。
  ?>
  最简单的测试方法是在加入数组成员前后打印sizeof()的运算结果,如果返回0和1,说明Array和sizeof()运行正常。
  例2. 采用打印语句测试Array和sizeof()
  $fixture = Array( );
  print sizeof($fixture) . "\n";
  $fixture[] = "element";
  print sizeof($fixture) . "\n";
  ?>
  0
  1
  现在,我们让测试程序从需要手工解释变为自动运行。在例3中,我们比较了期望值和实际值,如果相等就打印ok。如果我们发现有的结果不是ok,我们就知道有问题了。
  例3. 比较Array和sizeof()的期望值和实际值
  <?php
  $fixture = array( );
  print sizeof($fixture) == 0 ? "ok\n" : "not ok\n";$fixture[] = "element";
  print sizeof($fixture) == 1 ? "ok\n" : "not ok\n";?>
  ok
  ok
  我们现在引入一个新的要素,如果期望值和实际值不同,我们就抛出一个异常。这样我们的输出就更简单了。如果测试成功,什么也不做,如果有一个未处理异常,我们知道有问题了。
  例4.使用断言函数来测试Array和sizeof()
  $fixture = Array( );
  assertTrue(sizeof($fixture) = = 0);
  $fixture[] = "element";
  assertTrue(sizeof($fixture) = = 1);
  function assertTrue($condition) {
  if (!$condition) {
  throw new Exception("Assertion failed.");}
  }
  ?>
  现在测试完全自动化了。和我们第一个版本不同,这个版本使得测试完全自动化了。
  使用自动测试的目的是尽可能少的犯错误。尽管你的代码还不是完美的,用优良的自动测试,你会发现错误会明显减少。自动测试给了你对代码公正的信心。有这个信心,你可以在设计上有大胆的飞越,和你的团队伙伴关系更好,改善你和客户之间的关系,每天安心入睡,因为你可以证明由于你的努力,系统变得更好了。
 

上一篇:PHP程序加速探索之服务器负载测试

下一篇:轻松掌握PHP逻辑运算符语法和使用技术