<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>浮山狼de博客 &#187; php高效</title>
	<atom:link href="https://www.fushanlang.com/tag/php-effiency/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fushanlang.com</link>
	<description>next station - 下一站，活在当下，且行且思</description>
	<lastBuildDate>Sat, 29 Nov 2014 15:14:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.5</generator>
	<item>
		<title>PHP PDO访问数据库</title>
		<link>https://www.fushanlang.com/php-pdo-to-access-the-database-1032/</link>
		<comments>https://www.fushanlang.com/php-pdo-to-access-the-database-1032/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 06:45:04 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[PDO]]></category>
		<category><![CDATA[php高效]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=1032</guid>
		<description><![CDATA[为什么你应该使用PHP PDO访问数据库 <p>许多PHP程序员学习过如歌使用MySQL或MySQL扩展来访问数据库. 不过,自PHP 5.1版本以来,一个更好的解决方案出现了. PHP Data Objects (PDO) 提供了让你更有{productive}的准备{statements},处理对象的方法.</p> PDO 简介 <p>“PDO – PHP Data Objects – is a database access layer providing a uniform method of access to multiple databases.”</p> <p>它不受数据库特定语法限制, 但它可以让切换数据库和平台的过程更无痛,更简洁的切换数据库连接字符串.</p> <p></p> <p>这个教程并是一个完全的SQL入门. 它主要是为了帮助那些已经在使用MySQL或MySQLi扩展的人们过渡到更加强大、兼容性更好的PDO.</p> <p>数据库支持</p> <p>这个扩展能支持任何为PDO设计了驱动的数据库. 在写这篇文章的时候，以下数据库已经被支持:</p> PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase ) PDO_FIREBIRD ( Firebird/Interbase 6 <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/php-pdo-to-access-the-database-1032/">PHP PDO访问数据库</a></span>]]></description>
				<content:encoded><![CDATA[<h3>为什么你应该使用PHP PDO访问数据库</h3>
<p>许多PHP程序员学习过如歌使用MySQL或MySQL扩展来访问数据库. 不过,自PHP 5.1版本以来,一个更好的解决方案出现了. PHP Data Objects (PDO) 提供了让你更有{productive}的准备{statements},处理对象的方法.</p>
<hr />
<h3>PDO 简介</h3>
<blockquote><p>“PDO – PHP Data Objects – is a database access layer providing a uniform method of access to multiple databases.”</p></blockquote>
<p>它不受数据库特定语法限制, 但它可以让切换数据库和平台的过程更无痛,更简洁的切换数据库连接字符串.<span id="more-1032"></span></p>
<p><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/09/144504Eqm.png" alt="PDO - db abstraction layer" width="600" height="125" /></p>
<p>这个教程并是一个完全的SQL入门. 它主要是为了帮助那些已经在使用MySQL或MySQLi扩展的人们过渡到更加强大、兼容性更好的PDO.</p>
<p><strong>数据库支持</strong></p>
<p>这个扩展能支持任何为PDO设计了驱动的数据库. 在写这篇文章的时候，以下数据库已经被支持:</p>
<ul>
<li>PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase )</li>
<li>PDO_FIREBIRD ( Firebird/Interbase 6 )</li>
<li>PDO_IBM ( IBM DB2 )</li>
<li>PDO_INFORMIX ( IBM Informix Dynamic Server )</li>
<li>PDO_MYSQL ( MySQL 3.x/4.x/5.x )</li>
<li>PDO_OCI ( Oracle Call Interface )</li>
<li>PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC and win32 ODBC) )</li>
<li>PDO_PGSQL ( PostgreSQL )</li>
<li>PDO_SQLITE ( SQLite 3 and SQLite 2 )</li>
<li>PDO_4D ( 4D )</li>
</ul>
<p>所有这些驱动都没有被您的系统预装，这里有一种快速的方式来找到您需要的驱动：</p>
<blockquote><p>print_r(PDO::getAvailableDrivers());</p></blockquote>
<hr />
<h3>连接</h3>
<p>不同的数据库可能在连接方法上有那么一点点的不同. 下面,我们将介绍几种常见的数据库的连接方法. 你将会注意到前三种看起来差不多, 不过像SQLite之类的语言就有他自己独特的语法.</p>
<p><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/09/144505a75.png" alt="Connection String" width="600" height="125" /></p>
<div>try {<br />
 # MS SQL Server and Sybase with PDO_DBLIB<br />
 $DBH = new PDO(&#8220;mssql:host=$host;dbname=$dbname, $user, $pass&#8221;);<br />
 $DBH = new PDO(&#8220;sybase:host=$host;dbname=$dbname, $user, $pass&#8221;);</div>
<div> # MySQL with PDO_MYSQL<br />
   $DBH = new PDO(&#8220;mysql:host=$host;dbname=$dbname&#8221;, $user, $pass);</div>
<div> # SQLite Database<br />
   $DBH = new PDO(&#8220;sqlite:my/database/path/database.db&#8221;);<br />
   }<br />
   catch(PDOException $e) {<br />
   echo $e-&gt;getMessage();<br />
   }</div>
<p>请注意try/catch代码块 – 您应该始终将您 PDO 的操作封装在一个 try/catch 代码块内并使用异常机制 .通常你只会使用单个连接 – 下面将为您介绍它的语法.</p>
<p><strong>下文中出现的 $DBH 意思是 ‘database handle’.</strong></p>
<p>你可以通过把handle设置为null来关闭任何数据库连接.</p>
<blockquote><p># close the connection</p>
<p>$DBH = null;</p></blockquote>
<p>你可以从 PHP.net 获取更多关于特点数据库的选项和连接字串(connection strings）的信息</p>
<hr />
<h3>异常处理</h3>
<p>PDO 可以使用异常（Exceptions）来处理错误,这意味你需要把{处理PDO的}包括在一个try/catch代码块. 你也可以通过设置错误模式（error mode attribute）强制PDO在您最近创建的数据库连接上使用这三种错误模式中的一种. 以下提供了语法:</p>
<blockquote><p>$DBH-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );</p>
<p>$DBH-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );</p>
<p>$DBH-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );</p></blockquote>
<p>不过不管您设置什么错误模式, 错误的连接总会产生一个异常, 所以您应该在创建一个数据库时包含一个try/catch代码块.</p>
<p><strong>PDO::ERRMODE_SILENT</strong></p>
<p>这是默认的错误模式. 如果您使用了这种错误模式, 你将像您用mysql或mysqli扩展的时候那样自己检查错误. 这里还有两种更理想的符合[[DRY programming]]思想的方法.</p>
<p><strong>PDO::ERRMODE_WARNING</strong></p>
<p>这种模式将会发出（issue）一个标准的PHP warning,然后继续执行程序. 这种方法在调试时会很有用.</p>
<p><strong>PDO::ERRMODE_EXCEPTION</strong></p>
<p>这也许是人们在大多数情况下希望使用的模式. 它抛出（fire）一个异常, 允许你优雅的处理错误并且隐藏那些可能会导致安全风险的数据. 这里是一个处理异常的实例:</p>
<div># connect to the database<br />
   try {<br />
 $DBH = new PDO(&#8220;mysql:host=$host;dbname=$dbname&#8221;, $user, $pass);<br />
 $DBH-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );</div>
<div># UH-OH! Typed DELECT instead of SELECT!<br />
   $DBH-&gt;prepare(&#8216;DELECT name FROM people&#8217;);<br />
   }<br />
   catch(PDOException $e) {<br />
   echo &#8220;I&#8217;m sorry, Dave. I&#8217;m afraid I can&#8217;t do that.&#8221;;<br />
   file_put_contents(&#8216;PDOErrors.txt&#8217;, $e-&gt;getMessage(), FILE_APPEND);<br />
   }</div>
<p>上面是一个在select statement中的内部错误; 这将会引发一个异常. 这段异常处理代码将会把错误详情发送到一个日志文件中, 然后显示一个友好的(当然,友不友好随你便)消息给用户.</p>
<hr />
<h3>插入、更新数据</h3>
<p>插入新数据、或更新一个已经存在的数据，是最常见的数据库操作之一. PDO提供了一种[[normally a two-step process]]. 本节中介绍的所有内容同样适用于 UPDATE 和 INSERT 操作.</p>
<p><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/09/144505B3x.png" alt="2 to 3 step insert and update" width="600" height="125" /></p>
<p>下面是一个最基本的插入的例子:</p>
<blockquote><p># STH means “Statement Handle”</p>
<p>$STH = $DBH-&gt;prepare(“INSERT INTO folks ( first_name ) values ( ‘Cathy’ )”);</p>
<p>$STH-&gt;execute();</p></blockquote>
<p>您也可以直接使用exec()方法完成相同的操作(PS:使用exec()方法可以减少一个调用). 在大多数情况下,您可能会多次调用这个方法, 所以呢, 您可以享受到prepared statements带来的好处. 甚至如果您只想调用它一次, 使用prepared statements will 也会帮您挡住 SQL injection 攻击.</p>
<p><strong>Prepared Statements</strong></p>
<blockquote><p>使用 prepared statements 将帮助您防止 SQL injection 的危险.</p></blockquote>
<p>Prepared statement的语句是只需要发送数据到服务器的预编译 SQL 语句， 它具有自动处理数据以免受 SQL injection 攻击的优点。</p>
<p>您可以通过在您的SQL语句中包含占位符来使用 prepared statement . 这里有三个例子: 一个没有占位符的, 一个有未命名占位符（Unnamed Placeholders）的, 和一个有命名占位符（Named Placeholders）的.</p>
<div># no placeholders &#8211; ripe for SQL Injection!<br />
 $STH = $DBH-&gt;(&#8220;INSERT INTO folks (name, addr, city) values ($name, $addr, $city)&#8221;);</div>
<div># unnamed placeholders<br />
   $STH = $DBH-&gt;(&#8220;INSERT INTO folks (name, addr, city) values (?, ?, ?);</div>
<div># named placeholders<br />
   $STH = $DBH-&gt;(&#8220;INSERT INTO folks (name, addr, city) value (:name, :addr, :city)&#8221;);</div>
<p>您可能想避免使用第一种方法; 下面为您提供了它们直接的比较. 选择未命名占位符或命名占位符将会影响您如何为这些语句设置数据.</p>
<p><strong>未命名占位符（Unnamed Placeholders）</strong></p>
<div># assign variables to each place holder, indexed 1-3<br />
   $STH-&gt;bindParam(1, $name);<br />
   $STH-&gt;bindParam(2, $addr);<br />
   $STH-&gt;bindParam(3, $city);</div>
<div># insert one row<br />
   $name = &#8220;Daniel&#8221;<br />
   $addr = &#8220;1 Wicked Way&#8221;;<br />
   $city = &#8220;Arlington Heights&#8221;;<br />
   $STH-&gt;execute();</div>
<div># insert another row with different values<br />
   $name = &#8220;Steve&#8221;<br />
   $addr = &#8220;5 Circle Drive&#8221;;<br />
   $city = &#8220;Schaumburg&#8221;;<br />
   $STH-&gt;execute();</div>
<p>只需两步!首先，我们为不同的占位符（Placeholder）绑定变量 (lines 2-4). 然后，我们为那些占位符（Placeholder）赋值然后执行查询. 要想发送另外的一组数据，只需要改变那些变量的值，然后再执行即可.</p>
<p>(译注: 原文在第一步与第二布均使用了assign来描述过程)</p>
<p>这个使用很多参数的方法似乎有点麻烦?如果您的数据存储在数组中,有一个简单的方法:</p>
<div># the data we want to insert<br />
 $data = array(&#8216;Cathy&#8217;, &#8216;9 Dark and Twisty Road&#8217;, &#8216;Cardiff&#8217;);</div>
<div>$STH = $DBH-&gt;(&#8220;INSERT INTO folks (name, addr, city) values (?, ?, ?);<br />
   $STH-&gt;execute($data);</div>
<p>这很简单，不是吗?</p>
<p>在数组中的数据等同于占位符。 $data[0]对应第一个占位符,$data[1]第二个,依此类推,但如果您的数组索引并未排序,这将无法正常工作,您将需要重新索引这个数组.</p>
<p><strong>命名占位符（Named Placeholders）</strong></p>
<p>您可能已经猜到语法了,下面给出了一个例子:</p>
<div># the first argument is the named placeholder name &#8211; notice named<br />
# placeholders always start with a colon.<br />
 $STH-&gt;bindParam(&#8216;:name&#8217;, $name);</div>
<p>您也可以在这里使用一个快捷方式,但它可以和关联数组一起使用.</p>
<div># the data we want to insert<br />
   $data = array( &#8216;name&#8217; =&gt; &#8216;Cathy&#8217;, &#8216;addr&#8217; =&gt; &#8216;9 Dark and Twisty&#8217;, &#8216;city&#8217; =&gt; &#8216;Cardiff&#8217; );</div>
<div># the shortcut!<br />
   $STH = $DBH-&gt;(&#8220;INSERT INTO folks (name, addr, city) value (:name, :addr, :city)&#8221;);<br />
   $STH-&gt;execute($data);</div>
<p>你的数组中的键不需要以一个冒号开始,但是必须符合指定的占位符。如果你有一个二维数组(就是数组中的数组),您可以遍历它们,只需调用执行的每个数据的数组。</p>
<p>另一个命名占位符不错的特点是直接可以插入对象到您的数据库,如果命名的属性匹配字段的话.下面是一个例子对象:</p>
<div># a simple object<br />
   class person {<br />
 public $name;<br />
 public $addr;<br />
 public $city;</div>
<div> function __construct($n,$a,$c) {<br />
   $this-&gt;name = $n;<br />
   $this-&gt;addr = $a;<br />
   $this-&gt;city = $c;<br />
   }<br />
   # etc &#8230;<br />
   }</div>
<div>$cathy = new person(&#8216;Cathy&#8217;,&#8217;9 Dark and Twisty&#8217;,&#8217;Cardiff&#8217;);</div>
<div># here&#8217;s the fun part:<br />
   $STH = $DBH-&gt;(&#8220;INSERT INTO folks (name, addr, city) value (:name, :addr, :city)&#8221;);<br />
   $STH-&gt;execute((array)$cathy);</div>
<p>在执行中,对象被转换为一个数组.对象的属性被视为数组中的一个键. By casting the object to an array in the execute, the properties are treated as array keys.</p>
<hr />
<h3>选择数据</h3>
<p><img src="http://www.fushanlang.com/blog/wp-content/uploads/auto_save_image/2010/09/144506LWg.png" alt="Fetch data into arrays or objects" width="600" height="125" /></p>
<p>数据通过fetch()方法获得, {一种应用于陈述式句柄的方法}. 在使用fetch之间, 您最好告诉PDO您喜欢取得数据的样子. 您有以下几个选择:</p>
<ul>
<li><strong>PDO::FETCH_ASSOC:</strong> 返回一个包含列名索引的数组</li>
<li><strong>PDO::FETCH_BOTH (default):</strong> 返回一个由同时包含列名和数字索引的数组</li>
<li><strong>PDO::FETCH_BOUND</strong>: 通过 -&gt;bindColumn() 方法将列的值赋到变量上。</li>
<li><strong>PDO::FETCH_CLASS</strong>：列的值赋给指定对象的属性里。如果指定的属性不存在，会自动创建。</li>
<li><strong>PDO::FETCH_INTO:</strong> 更新一个已经存在的命名对象的实例</li>
<li><strong><strong>PDO::FETCH_LAZY</strong>:</strong> 结合 了PDO::FETCH_BOTH,PDO::FETCH_OBJ，在它们被调用时创建对象变量</li>
<li><strong>PDO::FETCH_NUM:</strong> 返回一个由同时包含列数字索引的数组</li>
<li><strong>PDO::FETCH_OBJ:</strong> fanhuire返回一个有对应的列名的属性的匿名对象</li>
</ul>
<p>在现实中,大多数情况下会使用以下三种: FETCH_ASSOC, FETCH_CLASS, FETCH_OBJ. 您需要使用以下语法设置获取类型:</p>
<blockquote><p>$STH-&gt;setFetchMode(PDO::FETCH_ASSOC);</p></blockquote>
<p>您也可以直接在fetch()方法中设置获取模式.</p>
<p><strong>FETCH_ASSOC</strong></p>
<p>这种模式创建一个按列名索引的关联数组.这应该会让用过MySQL/MySQLi扩展的人感到亲切.这里有一个使用这种方法选择数据的例子.</p>
<div># using the shortcut -&gt;query() method here since there are no variable<br />
   # values in the select statement.<br />
 $STH = $DBH-&gt;query(&#8216;SELECT name, addr, city from folks&#8217;);</div>
<div># setting the fetch mode<br />
   $STH-&gt;setFetchMode(PDO::FETCH_ASSOC);</div>
<div>while($row = $STH-&gt;fetch()) {<br />
   echo $row[&#8216;name&#8217;] . &#8220;n&#8221;;<br />
   echo $row[&#8216;addr&#8217;] . &#8220;n&#8221;;<br />
   echo $row[&#8216;city&#8217;] . &#8220;n&#8221;;<br />
   }</div>
<p>这个 while 循环将在获取完所有数据后停止.{The while loop will continue to go through the result set one row at a time until complete.}</p>
<p><strong>FETCH_OBJ</strong></p>
<p>这种模式为每一行数据创建一个标准类,下面是一个例子:</p>
<div># creating the statement<br />
 $STH = $DBH-&gt;query(&#8216;SELECT name, addr, city from folks&#8217;);</div>
<div># setting the fetch mode<br />
   $STH-&gt;setFetchMode(PDO::FETCH_OBJ);</div>
<div># showing the results<br />
   while($row = $STH-&gt;fetch()) {<br />
   echo $row-&gt;name . &#8220;n&#8221;;<br />
   echo $row-&gt;addr . &#8220;n&#8221;;<br />
   echo $row-&gt;city . &#8220;n&#8221;;<br />
   }</div>
<p><strong>FETCH_CLASS</strong></p>
<blockquote><p>您的对象的属性应该在constructor被调用前设置!这一点很重要!</p></blockquote>
<p>这种模式允许你直接将获取的数据发送到您选择的类中.当您使用FETCH_CLASS时,您的对象的属性应该在constructor被调用前设置。读一遍，它是重要的。如果属性相匹配的列名不存在，这些属性将被创建，（公共）为您。</p>
<p>这意味着如果你需要转换后出来的数据,它可以通过你的对象自动为转换.</p>
<p>举个列子,假设的情况下该地址必须为特定格式,我们可以通过constructor上做到这一点,下面是一个例子:</p>
<div>class secret_person {<br />
 public $name;<br />
 public $addr;<br />
 public $city;<br />
 public $other_data;</div>
<div> function __construct($other = &#8221;) {<br />
   $this-&gt;address = preg_replace(&#8216;/[a-z]/&#8217;, &#8216;x&#8217;, $this-&gt;address);<br />
   $this-&gt;other_data = $other;<br />
   }<br />
   }</div>
<p>OK,再让我们看看效果如何?</p>
<div>$STH = $DBH-&gt;query(&#8216;SELECT name, addr, city from folks&#8217;);<br />
 $STH-&gt;setFetchMode(PDO::FETCH_CLASS, &#8216;secret_person&#8217;);</div>
<div>while($obj = $STH-&gt;fetch()) {<br />
   echo $obj-&gt;addr;<br />
   }</div>
<p>如果地址是,‘5 Rosebud,’ 您将会在输出中看到 ‘5 Rxxxxxx’. 当然,可能有些情况下,您希望在constructor函数在数据被赋值之前调用.PDO也可以做到~</p>
<div>$STH-&gt;setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, &#8216;secret_person&#8217;);</div>
<p>现在，当你使用这个模式(PDO::FETCH_PROPS_LATE)的地址不会被遮,constructor会被首先调用然后再赋值.</p>
<p>最后,如果你真的需要,你可以在使用PDO获取数据到对象时,将参数传递给构造函数:</p>
<div>$STH-&gt;setFetchMode(PDO::FETCH_CLASS, &#8216;secret_person&#8217;, array(&#8216;stuff&#8217;));</div>
<p>如果你需要传递不同的数据到每个对象的构造函数,你可以设置在fetch方法内设置模式法模式:</p>
<div>$i = 0;<br />
while($rowObj = $STH-&gt;fetch(PDO::FETCH_CLASS, &#8216;secret_person&#8217;, array($i))) {<br />
// do stuff<br />
$i++<br />
}</div>
<hr />
<h3>其他有用的方法</h3>
<p>虽然 PDO 并没有面面俱到的(这扩展可不小!), 这里仍还还有一些您想知道的方法.</p>
<blockquote><p>$DBH-&gt;lastInsertId();</p></blockquote>
<p>lastInsertId()方法始终调用数据库句柄，而不是表达式的句柄，并且会返回该数据库连接上一次插入语句的自增ID.</p>
<blockquote><p>$DBH-&gt;exec(‘DELETE FROM folks WHERE 1′);</p>
<p>$DBH-&gt;exec(“SET time_zone = ‘-8:00′”);</p></blockquote>
<p>exec()方法用于那些不能返回数据或不影响行的操作. 上面是两种调用exec()方法的例子.</p>
<blockquote><p>$safe = $DBH-&gt;quote($unsafe);</p></blockquote>
<p>quote() 方法将字符转义为安全的字符以便在查询中使用. 如果您不使用已经准备号的语句，您可以用此方法&lt;&lt;*&gt;&gt;。</p>
<blockquote><p>$rows_affected = $STH-&gt;rowCount();</p></blockquote>
<p>rowCount() 方法返回一个表明被一个操作影响的行数的整数(简直是废话,难不成还是浮点数?). 更具这个错误报告(http://bugs.php.net/40822) ,在最近的一个PDO版本上这个方法不能够很好的与SELECT语句工作. 如果您遇到了这个问题而不想升级PHP的话, 你可以用以下的方法来替代它:</p>
<div>$sql = &#8220;SELECT COUNT(*) FROM folks&#8221;;<br />
if ($STH = $DBH-&gt;query($sql)) {<br />
# check the row count<br />
if ($STH-&gt;fetchColumn() &gt; 0) {</div>
<div># issue a real select here, because there&#8217;s data!<br />
}<br />
else {<br />
echo &#8220;No rows matched the query.&#8221;;<br />
}<br />
}</div>
<hr />
<h3>结尾</h3>
<p>我希望这篇文章能帮助您从mysql和mysqli扩展迁移至PDO.您有啥想法?现在想迁移到PDO么?</p>
<p>英文原文：http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/php-pdo-to-access-the-database-1032/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>spl_autoload_register用法</title>
		<link>https://www.fushanlang.com/spl_autoload_register-how-to-use-94/</link>
		<comments>https://www.fushanlang.com/spl_autoload_register-how-to-use-94/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 03:04:52 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[php高效]]></category>
		<category><![CDATA[spl_autoload_register]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=94</guid>
		<description><![CDATA[<p>php中导入未包含的php文件有4种用法：</p> <p>include(*.php) ,include_once(*.php) ,  require(*.php) , require_once(*.php) 四者的作用如下：</p> <p>1.include()函数会将指定的档案读入并且执行里面的程序。</p> <p>例如：include(&#8216;/home/me/myfile&#8217;);</p> <p>被导入的档案中的程序代码都会被执行，而且这些程序在执行的时候会拥有和源文件中呼叫到include()函数的位置相同的变量范围（variable scope）。你可以导入同一个服务器中的静态档案，甚至可以通过合并使用include()与fopen()函数来导入其它服务器上面的档案。</p> <p>2.include_once()函数的作用和include()是几乎相同的</p> <p>唯一的差别在于include_once()函数会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了，如果有的话就不会再次重复导入该档案（这项功能有时候是很重要的，比方说要导入的档案里面宣告了一些你自行定义好的函数，那么如果在同一个程序重复导入这个档案，在第二次导入的时候便会发生错误讯息，因为PHP不允许相同名称的函数被重复宣告第二次）。</p> <p>3.require()函数会将目标档案的内容读入，并且把自己本身代换成这些读入的内容。</p> <p>这个读入并且代换的动作是在PHP引擎编译你的程序代码的时候发生的，而不是发生在PHP引擎开始执行编译好的程序代码的时候（PHP 3.0引擎的工作方式是编译一行执行一行，但是到了PHP 4.0就有所改变了，PHP 4.0是先把整个程序代码全部编译完成后，再将这些编译好的程序代码一次执行完毕，在编译的过程中不会执行任何程序代码）。require()通常来导入静态的内容，而include()则适合用来导入动态的程序代码。</p> <p>4.如同include_once()函数，require_once()函数会先检查目标档案的内容是不是在之前就已经导入过了，如果是的话，便不会再次重复导入同样的内容。</p> <p>最常用的是require_once来导入不同php文件中的类和函数，但实际上每次都要判断是否已经加载等等，其效率较低，但为避免重复加载出错，又不得不如此。对于要导入类库php文件而言，PHP还有一个__autoload($className)来自动导入未知的类。估计是php推崇一个类总要放到一个文件里。</p> <p>然而，直接覆盖__autoload函数在引入多个类库时是不明智的，如果php版本&#62;5.1.2可以使用</p> spl_autoload_register (PHP 5 &#62;= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明 bool spl_autoload_register ([ callback $autoload_function ] ) 将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活，则激活它们。 如果在你的程序中已经实现了__autoload函数，它必须显式注册到__autoload栈中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或 spl_autoload_call()。 参数 autoload_function 欲注册的自动装载函数。如果没有提供任何参数，则自动注册autoload的默认实现函数 spl_autoload()。 返回值 如果成功则返回 TRUE，失败则返回 FALSE。 注：SPL是Standard PHP <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/spl_autoload_register-how-to-use-94/">spl_autoload_register用法</a></span>]]></description>
				<content:encoded><![CDATA[<p>php中导入未包含的php文件有4种用法：</p>
<p>include(*.php) ,include_once(*.php) ,  require(*.php) , require_once(*.php) 四者的作用如下：</p>
<p>1.include()函数会将指定的档案读入并且执行里面的程序。</p>
<p>例如：include(&#8216;/home/me/myfile&#8217;);</p>
<p>被导入的档案中的程序代码都会被执行，而且这些程序在执行的时候会拥有和源文件中呼叫到include()函数的位置相同的变量范围（variable scope）。你可以导入同一个服务器中的静态档案，甚至可以通过合并使用include()与fopen()函数来导入其它服务器上面的档案。</p>
<p>2.include_once()函数的作用和include()是几乎相同的</p>
<p>唯一的差别在于include_once()函数会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了，如果有的话就不会再次重复导入该档案（这项功能有时候是很重要的，比方说要导入的档案里面宣告了一些你自行定义好的函数，那么如果在同一个程序重复导入这个档案，在第二次导入的时候便会发生错误讯息，因为PHP不允许相同名称的函数被重复宣告第二次）。</p>
<p>3.require()函数会将目标档案的内容读入，并且把自己本身代换成这些读入的内容。<span id="more-94"></span></p>
<p>这个读入并且代换的动作是在PHP引擎编译你的程序代码的时候发生的，而不是发生在PHP引擎开始执行编译好的程序代码的时候（PHP 3.0引擎的工作方式是编译一行执行一行，但是到了PHP 4.0就有所改变了，PHP 4.0是先把整个程序代码全部编译完成后，再将这些编译好的程序代码一次执行完毕，在编译的过程中不会执行任何程序代码）。require()通常来导入静态的内容，而include()则适合用来导入动态的程序代码。</p>
<p>4.如同include_once()函数，require_once()函数会先检查目标档案的内容是不是在之前就已经导入过了，如果是的话，便不会再次重复导入同样的内容。</p>
<p>最常用的是require_once来导入不同php文件中的类和函数，但实际上每次都要判断是否已经加载等等，其效率较低，但为避免重复加载出错，又不得不如此。对于要导入类库php文件而言，PHP还有一个__autoload($className)来自动导入未知的类。估计是php推崇一个类总要放到一个文件里。</p>
<p>然而，直接覆盖__autoload函数在引入多个类库时是不明智的，如果php版本&gt;5.1.2可以使用</p>
<div><strong>spl_autoload_register</strong><br />
(PHP 5 &gt;= 5.1.2)</div>
<div>spl_autoload_register — 注册__autoload()函数</div>
<div><strong>说明</strong><br />
bool spl_autoload_register ([ callback $autoload_function ] )<br />
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活，则激活它们。</div>
<div>如果在你的程序中已经实现了__autoload函数，它必须显式注册到__autoload栈中。因为</div>
<div>spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或</div>
<div>spl_autoload_call()。</div>
<div><strong>参数</strong></div>
<div>autoload_function<br />
欲注册的自动装载函数。如果没有提供任何参数，则自动注册autoload的默认实现函数</div>
<div>spl_autoload()。</div>
<div><strong>返回值</strong><br />
如果成功则返回 TRUE，失败则返回 FALSE。</div>
<div>注：SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库，其主要功能包括autoload机制的实现及包括各种Iterator接口或类。 SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数 spl_autoload, spl_autoload_call，通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。</div>
<div><strong>范例</strong><br />
load.php文件</div>
<div>class LOAD<br />
{<br />
static function loadClass($class_name)<br />
{<br />
$filename = $class_name.&#8221;.class.php&#8221;;<br />
$path = &#8220;include/&#8221;.$filename<br />
if (is_file($path)) return include $path;<br />
}<br />
}</div>
<div>function my_auto_load($className){</div>
<div>$path=&#8221;my_load_lib/ext/$className&#8221;.&#8221;.php&#8221;;</div>
<div>if (is_file($path)) return require_once($path);</div>
<div>}</div>
<div>/**<br />
* 设置对象的自动载入<br />
* spl_autoload_register — Register given function as __autoload() implementation<br />
*/<br />
spl_autoload_register(array(&#8216;LOAD&#8217;, &#8216;autoload&#8217;));//引入静态加载函数</div>
<p>spl_autoload_register(&#8216;my_auto_load&#8221;);//引入单一加载函数</p>
<p>当一个未知类在php代码中出现时，autoload会依次执行，直到找到加载类为止。</p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/spl_autoload_register-how-to-use-94/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP高效率的写法</title>
		<link>https://www.fushanlang.com/php-efficiently-using-90/</link>
		<comments>https://www.fushanlang.com/php-efficiently-using-90/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 02:06:18 +0000</pubDate>
		<dc:creator><![CDATA[fushanlang]]></dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[php高效]]></category>
		<category><![CDATA[高效编程]]></category>

		<guid isPermaLink="false">http://www.fushanlang.com/blog/?p=90</guid>
		<description><![CDATA[<p>php语言本身保留很多类C的语法，而且也更像一个C实体库用来完成具体的功能。由于其解释执行的特性，如果想提高效率的话，可以注意以下几点。实际上php是松散的，不履行下面这些约定，仍然可以运行的很好，这是php极易入门的原因，语法松散灵活，很多人一周就可以自称熟练php了，然而这便造就了php高手和普通入门的人的编程差别。仔细读这些高效约定，熟悉C语言的人，可能会品出，对象，堆，栈，函数执行时存储区域的问题，所以这些约定对很多语言同样有效。</p> <p>0、用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会，注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。 1、如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。</p> <p>2、$row[’id’]的速度是$row[id]的7倍。</p> <p>3、echo比print快，并且使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接，比如echo$str1,$str2。</p> <p>4、在执行for循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。</p> <p>5、注销那些不用的变量尤其是大数组，以便释放内存。</p> <p>6、尽量避免使用__get，__set，__autoload。</p> <p>7、require_once()代价昂贵。</p> <p>8、include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。</p> <p>9、如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p> <p>10、函数代替正则表达式完成相同功能。</p> <p>11、str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。</p> <p>12、如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。</p> <p>13、使用选择分支语句（译注：即switchcase）好于使用多个if，elseif语句。</p> <p>14、用@屏蔽错误消息的做法非常低效，极其低效。</p> <p>15、打开apache的mod_deflate模块，可以提高网页的浏览速度。</p> <p>16、数据库连接当使用完毕时应关掉，不要用长连接。</p> <p>17、错误消息代价昂贵。</p> <p>18、在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p> <p>19、递增一个全局变量要比递增一个局部变量慢2倍。</p> <p>20、递增一个对象属性（如：$this-&#62;prop++）要比递增一个局部变量慢3倍。</p> <p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p> <p>22、仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。</p> <p>23、方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。</p> <p>24、派生类中的方法运行起来要快于在基类中定义的同样的方法。</p> <p>25、调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p> <p>26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p> <p>27、除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p> <p>28、尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码(OPcode)的缓存很有用，使得脚本不必为每个请求做重新编译。</p> <p>29、当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset()技巧加速执行你的代码。</p> <p>（举例如下） if(strlen($foo)&#60;5){echo“Fooistooshort”$$} （与下面的技巧做比较） if(!isset($foo{5})){echo“Fooistooshort”$$}</p> <p>调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。</p> <p>34、当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。</p> <p>35、并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p> <p>36、并非要用类实现所有的数据结构，数组也很有用。</p> <p>37、不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？</p> <p>38、当你需要时，你总能把代码分解成方法。</p> <p>39、尽量采用大量的PHP内置函数。</p> <p>40、如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p> <p>41、评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p> <p>42、mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p> <p>43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下，尽量用file_get_contents，因为他的效率高得多！但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题；</p> <p>44、尽量的少进行文件操作，虽然PHP的文件操作效率也不低的；</p> <p>45、优化SelectSQL语句，在可能的情况下尽量少的进行Insert、Update操作(在update上，我被恶批过)；</p> <p>46、尽可能的使用PHP内部函数（但是我却为了找个PHP里面不存在的函数，浪费了本可以写出一个自定义函数的时间，经验问题啊！）；</p> <p>47、循环内部不要声明变量，尤其是大变量：对象(这好像不只是PHP里面要注意的问题吧？)；</p> <p>48、多维数组尽量不要循环嵌套赋值；</p> <p>49、在可以用PHP内部字符串操作函数的情况下，不要用正则表达式；</p> <p>50、foreach效率更高，尽量用foreach代替while和for循环；</p> <p>51、用单引号替代双引号引用字符串；</p> <span style="color:#777"> . . . &#8594; Read More: <a href="https://www.fushanlang.com/php-efficiently-using-90/">PHP高效率的写法</a></span>]]></description>
				<content:encoded><![CDATA[<p>php语言本身保留很多类C的语法，而且也更像一个C实体库用来完成具体的功能。由于其解释执行的特性，如果想提高效率的话，可以注意以下几点。实际上php是松散的，不履行下面这些约定，仍然可以运行的很好，这是php极易入门的原因，语法松散灵活，很多人一周就可以自称熟练php了，然而这便造就了php高手和普通入门的人的编程差别。仔细读这些高效约定，熟悉C语言的人，可能会品出，对象，堆，栈，函数执行时存储区域的问题，所以这些约定对很多语言同样有效。</p>
<p>0、用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会，注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。<br />
1、如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。</p>
<p>2、$row[’id’]的速度是$row[id]的7倍。</p>
<p>3、echo比print快，并且使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接，比如echo$str1,$str2。</p>
<p>4、在执行for循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。<span id="more-90"></span></p>
<p>5、注销那些不用的变量尤其是大数组，以便释放内存。</p>
<p>6、尽量避免使用__get，__set，__autoload。</p>
<p>7、require_once()代价昂贵。</p>
<p>8、include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。</p>
<p>9、如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p>
<p>10、函数代替正则表达式完成相同功能。</p>
<p>11、str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。</p>
<p>12、如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。</p>
<p>13、使用选择分支语句（译注：即switchcase）好于使用多个if，elseif语句。</p>
<p>14、用@屏蔽错误消息的做法非常低效，极其低效。</p>
<p>15、打开apache的mod_deflate模块，可以提高网页的浏览速度。</p>
<p>16、数据库连接当使用完毕时应关掉，不要用长连接。</p>
<p>17、错误消息代价昂贵。</p>
<p>18、在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p>
<p>19、递增一个全局变量要比递增一个局部变量慢2倍。</p>
<p>20、递增一个对象属性（如：$this-&gt;prop++）要比递增一个局部变量慢3倍。</p>
<p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p>
<p>22、仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。</p>
<p>23、方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。</p>
<p>24、派生类中的方法运行起来要快于在基类中定义的同样的方法。</p>
<p>25、调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p>
<p>26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p>
<p>27、除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p>
<p>28、尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码(OPcode)的缓存很有用，使得脚本不必为每个请求做重新编译。</p>
<p>29、当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset()技巧加速执行你的代码。</p>
<p>（举例如下）<br />
if(strlen($foo)&lt;5){echo“Fooistooshort”$$}<br />
（与下面的技巧做比较）<br />
if(!isset($foo{5})){echo“Fooistooshort”$$}</p>
<p>调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。</p>
<p>34、当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如<a title="Zend" href="http://hosting.softfreelancer.com/tag/zend">Zend</a>的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。</p>
<p>35、并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
<p>36、并非要用类实现所有的数据结构，数组也很有用。</p>
<p>37、不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？</p>
<p>38、当你需要时，你总能把代码分解成方法。</p>
<p>39、尽量采用大量的PHP内置函数。</p>
<p>40、如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p>
<p>41、评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p>
<p>42、mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
<p>43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下，尽量用file_get_contents，因为他的效率高得多！但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题；</p>
<p>44、尽量的少进行文件操作，虽然PHP的文件操作效率也不低的；</p>
<p>45、优化SelectSQL语句，在可能的情况下尽量少的进行Insert、Update操作(在update上，我被恶批过)；</p>
<p>46、尽可能的使用PHP内部函数（但是我却为了找个PHP里面不存在的函数，浪费了本可以写出一个自定义函数的时间，经验问题啊！）；</p>
<p>47、循环内部不要声明变量，尤其是大变量：对象(这好像不只是PHP里面要注意的问题吧？)；</p>
<p>48、多维数组尽量不要循环嵌套赋值；</p>
<p>49、在可以用PHP内部字符串操作函数的情况下，不要用正则表达式；</p>
<p>50、foreach效率更高，尽量用foreach代替while和for循环；</p>
<p>51、用单引号替代双引号引用字符串；</p>
<p>52、“用i+=1代替i=i+1。符合c/c++的习惯，效率还高”；</p>
<p>53、对global变量，应该用完就unset()掉；</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fushanlang.com/php-efficiently-using-90/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.160 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2025-12-17 17:14:50 -->
