分类目录归档:php

php入门与提高::::::演道网php专栏提供一线php研发人员在学习工作中的经验,减少大家走的弯路,大量源码可以直接使用。

通过php写wordpress博客

前言

vim,emacs什么的都有写wordpress的插件。
这篇就提供php版本的发博客的代码。

关键代码

require 'config.inc.php';
require 'common.inc.php';
require 'lib/Readability.inc.php';
require 'lib/class-IXR.php';
require 'lib/plugin.php';
require 'lib/xmlrpc.inc';

$xmlrpcurl='http://go2live.cn/xmlrpc.php';//请填入你自己的博客地址。

$blogid='1';
$username='xxxx';//请填入你的wordpress的用户名
$password='xxxxx';//请填入你的Wordpress的密码

$postTitle='博客标题';//要发布的博客的标题
$postContent='博客内容';//要发布的博客的内容

//$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
define ('DOMAIN', 'go2live.cn'); // 博客的域名,请填入你自己的博客的域名
// 创建 xml-rpc client 
$cl = new xmlrpc_client ( "/xmlrpc.php", DOMAIN, 80); 
// 准备请求 
$req = new xmlrpcmsg('metaWeblog.newPost'); 
// 逐个列出请求的参数: 
$req->addParam ( new xmlrpcval ( 1, 'int')); // 博客ID 
$req->addParam ( new xmlrpcval ( $username, 'string' )); // 用户名 
$req->addParam ( new xmlrpcval ( $password, 'string' )); // 密码 
$struct = new xmlrpcval (
    array ( "title" => new xmlrpcval ( $postTitle, 'string' ), // 标题 
    "description" => new xmlrpcval ($postContent , 'string'), // 内容
    "author"=> new xmlrpcval("bjmayor","string"),//作者,可不填
    "post_type"=>new xmlrpcval("post",'string'),//发布类型,是页面还是博客。post为博客
    "post_status"=>new xmlrpcval("publish",'string'),//发布状态,
    "dateCreated"=>new xmlrpcval(strtotime("2015-12-12 09:23:22"),"dateTime.iso8601"),//发布时间,可不填,默认为当前时间。
    "categories"=>new xmlrpcval(array(new xmlrpcval("美文赏析","string")),"array")//分类信息,分类信息是需要已经存在的分类。
),
"struct" );
$req->addParam ( $struct ); 
$req->addParam ( new xmlrpcval (1, 'int')); // 立即发布
// 发送请求 
$ans = $cl->send($req); 
var_dump ( $ans );

参考

MetaWeblog API中文说明
demo代码下载

异常在 PHP 5.3 中的最佳实践

每一个新的功能添加到PHP运行时会创建一个指数随机数,通过这样的方式开发者可以使用和甚至滥用这个新特性。然而,直到一些好的和坏的使用情况陆续出现开发者们才达成了共识。当这些新案例不断浮现,我们终于可以辨别出什么是最好或最坏的做法。

异常处理在PHP中的确无论如何都不算是一个新的特征。但在本文中,我们将讨论在PHP 5.3中基于异常处理的两个新的特点。第一个是嵌套异常第二是一套SPL(现在的PHP运行机制的一个核心扩展)的扩展的新的异常类型。这两个新特性,这本书里都能找到最佳实践值得各位去详细研究。

特别要注意:这些特性中的一些已经存在于低于5.3的PHP版本之中,或者至少能够在低于5.3的版本之中被实现.  而当本文提到 PHP 5.3, 并不是严责意义上的 PHP 运行时版本. 相反,它意味着代码库和项目是采用 PHP 5.3 作为最低版本的,但同时也是在新的发展阶段出现的所有最佳实践.  这个发展阶段所凸显的是特定的几个像Zend Framework, Symfony, Doctrine 以及 PEAR 这样的项目所进行的“2.0”尝试.

背景

PHP 5.2  只有一个异常类 Exception。按照 Zend Framework / PEAR 的开发标准, 这个类是你的库中所有异常类的基类。如果你创建一个名叫 MyCompany 的库,按 Zend Framework / PEAR 的标准, 库中所有的代码文件都会以 MyCompany_ 开头。要是你想给库创建自己的异常基类: MyCompany_Exception, 那就用该类继承 Exception,然后再由组件(component )继承和抛出该异常类。比如你有一个组件 MyCompany_Foo,你可以给它创建一个用在该组件内部的异常基类 MyCompany_Foo_Exception。这些异常能被捕捉 MyCompany_Foo_Exception,MyCompany_Exception 或 Exception 的代码捉到。 对于库中其他用到该组件的代码来说,这是个三层的异常(或更多,取决于 MyCompany_Foo_Exception 的子类有几层 ), 他们可以根据自己的需要处理这些异常。

在php5中,基本异常类已经支持嵌套的特性了。什么是嵌套呢?嵌套是一种能力可以去捕获特殊异常,或者捕获参照原始异常而创建的一个新的异常对象。这将会允许caller属性在更公开的类型的开销库中出现的两种异常类上得到体现,当然也会在具有原始异常行为的异常类上体现。

为什么这些特性很有用?通常,通过使用其他代码来抛出自己的类型的异常是最有效的代码。这些代码可能是使用适配器模式封装的提供一些适应性更强强的函数的第三方代码库的代码,或利用一些PHP扩展来抛出异常的简单代码。

例如,在组件 Zend_Db 中, 它使用了适配器模式来封装特定的 PHP 扩展,来创建一个数据库抽象层.  在一个适配器中, Zend_Db 封装了 PDO, 而 PDO 会抛出它自己的异常 PDOException, Zend_Db 需要捕获这些特定于 PDO 的异常,并让它们以可预期且类型已知的 Zend_Db_Exception 重新被抛出. 这样就给了开发者保证, Zend_Db 将总是抛出 Zend_Db_Exception 类型的异常(因此可以被捕获), 而他们同时也可以在需要的时候访问到最开始被抛出的 PDOException.

下面的示例展示了一个虚构的数据库适配器可能如何去实现嵌入式的异常:

class MyCompany_Database
{
    /**
    * @var PDO object setup during construction
    */
    protected $_pdoResource = null;
   
    /**
    * @throws MyCompany_Database_Exception
    * @return int
    */
    public function executeQuery($sql)
    {
        try {
            $numRows = $this->_pdoResource->exec($sql);
        } catch (PDOException $e) {
            throw new MyCompany_Database_Exception(‘Query was unexecutable’, null, $e);
        }
        return $numRows;
    }
 
}

为了使用嵌入式的异常,你就得调用被捕获异常的getPrevious()方法:

// $sql and $connectionParameters assumed
try {
    $db = new MyCompany_Database(‘PDO’, $connectionParams);
    $db->executeQuery($sql);
} catch (MyCompany_Database_Exception $e) {
    echo ‘General Error: ‘ . $e->getMessage() . “\n”;
    $pdoException = $e->getPrevious();
    echo ‘PDO Specific error: ‘ . $pdoException->getMessage() . “\n”;
}

大多数最近被实现的PHP扩展都拥有OO(面向对象)接口.  因此,这些API倾向于抛出异常,而不是发生错误终止。PHP中能够抛出异常的扩展,稍微列举出几个就包括有PDO, DOM, Mysqli, Phar, Soap 以及 SQLite.

新特性:新核心异常类型

在PHP 5.3开发中,我们展示了一些有趣的新异常类型。这些异常在PHP 5.2.x中已经存在,但最近还没到“重新评估”异常的最佳实践,现在他们会显得更加引人注目。他们在SPL扩展中得以应用,并在手册中列出(这里)由于这些新的异常类型是PHP核心的一部分,也是SPL的一部分,它们可以被任何用PHP 5.3(及以上)运行代码的人使用。虽然在编写应用程序层的代码时,看起来不那么重要,但在我们写或者使用代码库时,使用这些新异常类型变得更加重要

那么为什么新异常是普通类型?以前,开发者试图通过在异常消息提醒中放入更多的内容来赋予异常更多的含义。虽然这样做是可行的,但是它有几个缺点。一是你无法捕获基于消息的异常。这可是一个问题,如果你知道一组代码是同样的异常类型与不同的提示消息对应不同异常情况下,处理起来的难度将相当的大。例如,一个认证类,在对$auth->authenticate();;它抛出异常的相同类型的(假设是异常),但不同的消息对应两个具体的故障:产生故障原因是认证服务器不能达到但是相同的异常类型却提示失败的验证消息不同。在这种情况下(注意,使用异常可能不是处理认证响应最好的方式),这将需要用字符串来解析消息从而处理这两种不同的情况。

这个问题的解决办法显然是通过某种方式对异常进行编码,这样就可以在需要辨别如何对这种异常环境做出反应的时候能够更加容易的查询到。第一个反应库是使用异常基类的$code属性。另一个是通过创建可以被抛出且能描述自身行为的子类或者新的异常类。这两种方法具有相同的明显的缺点。两者都没有呈现出想这样的最好的例子。两者都不被认为是一个标准,因此每个试图复制这两种解决方案的项目都会有小的变化,这就迫使使用这需要回到文档以了解所创建的库中已经有的具体解决方案。现在通过使用SPL的新的类型方法,也称作php标准库;开发者就可以以同样的方式在他们的项目中,并且复用这些项目的新的最佳的方法已经出现。

第二个缺点是使用详细信息的做法使得理解这些异常情况对那些非英语或英语能力有限的开发者来说十分困难。这可能会使的开发者在试图理解异常信息的含义的过程十分的缓慢。许多开发者也会写关于异常的文章,因为还未出现一个统一的整合过的标准所要有同这些开发者数量相同的不同的版本来描述异常消息所描述的情况。

所以我如何去使用它们,就用这些让人无语的密密麻麻的细节描述?

现在在SPL中有总共13个新的异常类型。其中两个可被视为基类:逻辑异常和运行时异常;两种都继承php异常类。其余的方法在逻辑上可以被拆分为3组:动态调用组,逻辑组和运行时组。

动态调用组包含异常 BadFunctionCallException和BadMethodCallException,BadMethodCallException是BadFunctionCallException(LogicException的子类)的子类,这意味着这些异常可以被其直接类型(译者注:就是异常自身的类型,大家都知道异常有很多种)、LogicException,或者Exception抓到(译者注:就是catch)你应该在什么时候使用这些?通常,你应该在由一个无法处理的__call()方法产生的情况,或者回调无法不是一个有效的函数(简单说,当某些东西并非is_callable())时使用。

例如:

// OO variant
class Foo
{
    public function __call($method, $args)
    {
        switch ($method) {
            case ‘doBar’: /* … */ break;
            default:
                throw new BadMethodCallException(‘Method ‘ . $method . ‘ is not callable by this object’);
        }
    }
 
}
 
// procedural variant
function foo($bar, $baz) {
    $func = ‘do’ . $baz;
    if (!is_callable($func)) {
        throw new BadFunctionCallException(‘Function ‘ . $func . ‘ is not callable’);
    }
}

一个直接的例子,在__call时call_user_func()。这组异常在开发各种API动态方法的调用、函数调用时非常有用,例如这是一个可以被SOAP和XML-RPC客户端/服务端能够发送和解释的请求。

第二组是逻辑(logic )组。这组由DomainException、InvalidArgumentException、LengthException、OutOfRangeException组成。这些异常也是LogicException的子类,当然也是PHP的Exception的子类。在有状态不定,或者错误的方法/函数的参数时使用这些异常。为了更好地理解这一点,我们先看看最后一组异常

最后一组是运行时(runtime )组。它由OutOfBoundsException、OverflowException、RangeException、UnderflowException、UnexpectedValueExceptio组成。这些异常也是RuntimeException的子类,当然也是PHP的Exception的子类。在“运行时”(runtime)的函数、方法发生异常时,这些异常(运行时组)会被调用

逻辑组和运行时组如何一起工作?如果你看看对象的剖析,通常是发生的是两者之一。首先,对象将跟踪并改变状态。这意味着对象通常是不做任何事情。它可能会传递结构给��,它可能会通过setter和getter设置一些东西(译者注:例如$this->foo=’foo’),或者,它可能会引用其他对象。第二,当对象不跟踪或改变状态,这代表正在操作——做它该做的事。这是对象的运行时(runtime)。例如,在对象的一生中,它可能被创建,设置一些东西,那么它可能会被setFoo($foo),setBar($bar)。在这些时候,任何类型的LogicException应该被提高。此外,当对象内的方法被带参数调用时,例如$object->doSomething($someVariation);在前几行检查$someVariation变量时,可能抛出一个LogicException。完成检查$someVariation后,它继续做它该做的doSomething(),这时被认为是它的“运行时”(runtime),在这段代码中,可能抛出RuntimeExcpetions异常。

要理解得更好,我们来看看这个概念在代码中的运用:

class Foo
{
    protected $number = 0;
    protected $bar = null;
 
    public function __construct($options)
    {
        /** 本方法抛出LogicException异常 **/
    }
   
    public function setNumber($number)
    {
        /** 本方法抛出LogicException异常 **/
    }
   
    public function setBar(Bar $bar)
    {
        /** 本方法抛出LogicException异常 **/
    }
   
    public function doSomething($differentNumber)
    {
        if ($differentNumber != $expectedCondition) {
            /** 在这里,抛出LogicException异常 **/
        }
       
        /**
        * 在这里,本方法抛出RuntimeException异常
        */
    }
 
}

现在理解了这一概念,那么,对代码库的使用者来说,这是做什么的呢?使用者可以随时确定对象的异常状态,他们可以用异常的具体的类型来捕获(catch)异常,例如InvalidArgumentException或LengthException,至少也是LogicException。通过这种级别的精度调整,和类型的多样,他们可以用LogicException捕获最小的异常,但也可以通过实际的异常类型获得更好的理解。同样的概念也适用于运行时的异常,可以抛出更多的特定类型的异常,并且不论是特定或非特定类型的异常,都可以被捕获(catch)。它可以给使用者提供更详细的情况和精确度。

下面是一个关于SPL异常的表,您可能会有兴趣

类库代码中的最佳实践

PHP 5.3 带来了新的异常类型, 同时也带给我们新的最佳实践. 除了将某些特定的异常(如: InvalidArgumentException, RuntimeException)标准化外, 捕捉组件级的异常, 也很重要. 关于这方面, ZF2 wiki 和 PEAR2 wiki 上面有深入的探讨.

简而言之, 除了上面提到的各种最佳实践, 我们还应该用 Marker Interface 来创建一个组件级的异常基类. 通过创建组件级的 Marker Interface, 用在组件内部的异常既能继承 SPL 的异常类型, 也能在运行时被各种代码捕捉. 我们来看下列代码:

// usage of bracket syntax for brevity
namespace MyCompany\Component {
 
    interface Exception
    {}
 
    class UnexpectedValueException
        extends \UnexpectedValueException
        implements Exception
    {}
 
    class Component
    {
        public static function doSomething()
        {
            if ($somethingExceptionalHappens) {
                throw new UnexpectedValueException(‘Something bad happened’);
            }
        }
    }
 
}

如果调用上面代码中的 MyCompany\Component\Component::doSomething() 函数, doSomething() 抛出的异常可以当作下列异常类型捕捉: PHP 的 Exception, SPL 的 UnexpectedValueException, SPL 的 RuntimeException, 该组件的MyCompany\Component\UnexpectedValueException, 或该组件的 MyCompany\Component\Exception. 这为捕捉你的类库组件中的异常提供了极大的便利. 此外, 通过分析异常的类型, 我们也能看出某个异常的含义. 

总结

总而言之,本文旨在教大家, 创建和抛出异常的最佳标准做法, 即: 应该多关注异常的类型, 少纠结异常的错误消息。如果你有什么看法, 欢迎在这里留言, 或在 PHP 文档网页, 亦或是上面给出链接的ZF2 wiki 留言。

CentOS 6.3 安装LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm

在部署LNMP的时候遇到Nginx启动失败的2个问题 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu安装Nginx php5-fpm MySQL(LNMP环境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

《细说PHP》高清扫描PDF+光盘源码+全套教学视频 http://www.linuxidc.com/Linux/2014-03/97536.htm

PHP 的详细介绍请点这里
PHP 的下载地址请点这里

PHP 如何阻止用户上传成人照片或者裸照

在这份教程中,我们将会学习到如何组织用户通过PHP上传成人照片或者裸照.

PHP源码下载

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2014年资料/4月/28日/PHP 如何阻止用户上传成人照片或者裸照

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

我在phpclasses.org上面偶然发现一个很有用的,由Bakr Alsharif开发的可以帮助开发者基于皮肤像素点来检测图片裸照的类文件.

它会分析在一张图片的不同部分使用的颜色,并决定其是否匹配人类皮肤颜色的色调.

作为分析的结果,他会返回一个反映图片包含裸露的可能性的分值.

此外,他还可以输出被分析的图片,上面对使用给定颜色的肤色的像素进行了标记.

当前它可以对PNG,GIF和JPEG图片进行分析.

下面展示了如何使用这个PHP类.

让我们先从包含裸体过滤器,nf.php文件开始.

include (‘nf.php’);

接下来,创建一个新的名叫ImageFilter的类,然后把它放到一个叫做$filter的变量中.

$filter = new ImageFilter;

获取图片的分值并将其放到一个$score变量中.

$score = $filter -> GetScore($_FILES[‘img’][‘tmp_name’]);

如果图片分值大于或等于60%,那就展示一条(告警)消息.

if($score >= 60){
/*Message*/
}

下面是所有的PHP代码:

/*Include the Nudity Filter file*/
include (‘nf.php’);
/*Create a new class called $filter*/
$filter = new ImageFilter;
/*Get the score of the image*/
$score = $filter -> GetScore($_FILES[‘img’][‘tmp_name’]);
/*If the $score variable is set*/
if (isset($score)) {
    /*If the image contains nudity, display image score and message. Score value if more than 60%, it is considered an adult image.*/
    if ($score >= 60) {
        echo “Image scored ” . $score . “%, It seems that you have uploaded a nude picture.”;
    /*If the image doesn’t contain nudity*/   
    } else if ($score < 0) {
        echo “Congratulations, you have uploaded an non-nude image.”;
    }
}
?>

标记语言

我们可以使用一个基础的HTML表单上传图片.



总结
请记得,PHP不能够检测所有的裸体图片,所以不完全可信.我希望你觉得这还有点

PHP 4即将完成使命 期待PHP 6的发布

<

div id=”content” contentScore=”1632″>PHP 4在发布7年后完成了它的使命,现在,更让人期待的将是PHP 6的发布。

开发人员一直喜爱的第4版PHP开放源代码软件今年已经7岁了,PHP 4让众多服务器可以方便的创建自定义的网页,例如在线目录或搜索结果列表。现如今,其寿命的终点已经逼近。

“PHP开发团队特此宣布对PHP 4的技术支持会持续到07年年底为止,”7月13日在PHP的官方网站上项目负责人表示,“我们将在2008年8月8日前继续跟踪PHP 4项目,并及时给出重大安全修补。”

在PHP 5发布三周年纪念日上,项目开发者同时也宣称他们希望更多的关注和讨论即将发布的PHP 6。

“这项宣布将促使整个产业的生态链继续向前发展,”Zend公司的创办人兼首席行政技术主管安迪声称,“该生态链包括了那些使用直接编译好的PHP用户,基于PHP进行的更高一级开发应用的厂商例如Drupal或Joomla,以及使用PHP技术架构的网站。作为商业化程度更高的PHP 5,可以更好的应对现代Web应用系统架构的挑战,包括提供了Web Services的支持,AJAX、XML及面向对象编程等技术。”

对于常用软件而言,真正的退出历史舞台是很困难的,就连微软也发现试图停止对Windows ME和Windows NT 4的支持是很困难的,同样并非每一个人都愿意看到PHP 4寿终正寝。

PHP 6的特性包括更好的国际化语言的支挼/div>

PHP代码优化24条真经

PHP代码优化24条真经

1.echo比print快。

2.使用echo的多重参数代替字符串连接。

3.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

4.对global变量,应该用完就unset()掉。

5.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。

6.函数代替正则表达式完成相同功能。

7.当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。

8.使用选择分支语句(switch case)好于使用多个if,else if语句。

9.利用var_dump进行PHP代码调试。如果你在寻找php调试技术,我必须说var_dump应该是你要找的目标,在显示php信息方面这个命令可以满足你的所有需要,而调试代码的多数情况与得到PHP中的数值有关。

10.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

11.动辄创建全局数值是一种糟糕的做法,不过有时候实际情况的确又需要这么做。对于数据库表或数据库连接信息使用全局数值是一个不错的想法,但不要在你的PHP代码中频繁使用全局数值。另外,更好的一种做法是把你的全局变量存放在一个config.php文件中。

12.如果你想知道脚本开始执行的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

13.打开apache的mod_deflate模块。

14.用@屏蔽错误消息的做法非常低效。

15.尽量采用大量的PHP内置函数。

16.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

17.派生类中的方法运行起来要快于在基类中定义的同样的方法。

18.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)

19.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

20.正如之前提到的,任何php网站中最重要的部分有99%的可能是数据库。因此,你需要非常熟悉如何正确的使用sql,学会关联表和更多高级的数据库技术。

21.调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。

22.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回zval结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。

23.并不是所有情况都必须使用面向对象开发,面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

24.除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

CentOS 6.3 安装LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm

在部署LNMP的时候遇到Nginx启动失败的2个问题 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu安装Nginx php5-fpm MySQL(LNMP环境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

《细说PHP》高清扫描PDF+光盘源码+全套教学视频 http://www.linuxidc.com/Linux/2014-03/97536.htm

PHP 的详细介绍请点这里
PHP 的下载地址请点这

PHP 5.3 新特性详解

1 PHP 5.3中的新特性

1.1 支持命名空间 (Namespace)

毫无疑问,命名空间是PHP5.3所带来的最重要的新特性。

在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符为反斜杆\。

//select.php
    namespace Zend\Db\Table;   
    class Select {

    }
?> 

这样即使其它命名空间下存在名为Select的类,程序在调用时也不会产生冲突。代码的可读性也有所增加。
调用方法:

//call.php
    //namespace Zend\Db;   
    include(‘select.php’);   
    $s = new Zend\Db\Table\Select();   
    $s->test();
?>

1.2. 支持延迟静态绑定(Late Static Binding)

在PHP5中,我们可以在类中通过self关键字或者__CLASS__来判断或调用当前类。但有一个问题,如果我们是在子类中调用,得到的结果将是父类。因为在继承父类的时候,静态成员就已经被绑定了。 例如:

class A {   
    public static function who() {   
        echo __CLASS__;   
    }   
    public static function test() {   
        self::who();   
    }   
}   
class B extends A {   
    public static function who() {   
        echo __CLASS__;   
    }   
}   
B::test();

//以上代码输出的结果是: A ; 这和我们的预期不同,我们原来想得到子类的相应结果。

PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定:

class A {   
    public static function who() {   
        echo __CLASS__;   
    }   
    public static function test() {   
        static::who(); // 这里实现了延迟的静态绑定   
    }   
}   
class B extends A {   
    public static function who() {   
        echo __CLASS__;   
    }   
}   
   
B::test();

//以上代码输出的结果是: B

1.3 支持goto语句

多数计算机程序设计语言中都支持无条件转向语句goto,当程序执行到goto语句时,即转向由goto语句中的标号指出的程序位置继续执行。尽管 goto语句有可能会导致程序流程不清晰,可读性减弱,但在某些情况下具有其独特的方便之处,例如中断深度嵌套的循环和 if 语句。

 
    goto a;   
    echo ‘Foo’;   
    a:   
    echo ‘Bar’;   
    for($i=0,$j=50; $i<100; $i++) {   
      while($j–) {   
        if($j==17) goto end;   
      }   
    }   
    echo “i = $i”;   
    end:   
    echo ‘j hit 17’; 

1.4 支持闭包、Lambda/Anonymous函数

闭包(Closure)函数和Lambda函数的概念来自于函数编程领域。例如JavaScript 是支持闭包和 lambda 函数的最常见语言之一。 在PHP中,我们也可以通过create_function()在代码运行时创建函数。但有一个问题:创建的函数仅在运行时才被编译,而不与其它代码同时被编译成执行码,因此我们无法使用类似APC这样的执行码缓存来提高代码执行效率。在PHP5.3中,我们可以使用Lambda/匿名函数来定义一些临时使用(即用即弃型)的函数,以作为array_map()/array_walk()等函数的回调函数。

    echo preg_replace_callback(‘~-([a-z])~’, function ($match) {   
        return strtoupper($match[1]);   
    }, ‘hello-world’);   
    // 输出 helloWorld 
 
    $greet = function($name)   
    {   
        printf(“Hello %s\r\n”, $name);   
    };   
    $greet(‘World’);   
    $greet(‘PHP’);
 
    //…在某个类中   
    $callback = function ($quantity, $product) use ($tax, &$total) {   
      $pricePerItem = constant(__CLASS__ . “::PRICE_” .  strtoupper($product));   
      $total += ($pricePerItem * $quantity) * ($tax + 1.0);   
    };   
    array_walk($products, $callback); 

1.5 新增两个魔术方法__callStatic()和__invoke()

PHP中原本有一个魔术方法__call(),当代码调用对象的某个不存在的方法时该魔术方法会被自动调用。新增的__callStatic()方法则只用于静态类方法。当尝试调用类中不存在的静态方法时,__callStatic()魔术方法将被自动调用。 

class MethodTest {   
    public function __call($name, $arguments) {   
        // 参数 $name 大小写敏感   
        echo “调用对象方法 ‘$name’ ” . implode(‘ — ‘, $arguments). “\n”;   
    }   
    /**  PHP 5.3.0 以上版本中本类方法有效  */   
    public static function __callStatic($name, $arguments) {   
        // 参数 $name 大小写敏感   
        echo “调用静态方法 ‘$name’ ” . implode(‘ — ‘, $arguments). “\n”;   
    }   
}   
 
$obj = new MethodTest;   
$obj->runTest(‘通过对象调用’);   
MethodTest::runTest(‘静态调用’);  // As of PHP 5.3.0 

//以上代码执行后输出如下:
//调用对象方法’runTest’ –- 通过对象调用
//调用静态方法’runTest’ –- 静态调用

以函数形式来调用对象时,__invoke()方法将被自动调用。

class MethodTest {   
    public function __call($name, $arguments) {   
        // 参数 $name 大小写敏感   
        echo “Calling object method ‘$name’ ” . implode(‘, ‘, $arguments). “\n”;   
    }   
       
    /**  PHP 5.3.0 以上版本中本类方法有效  */   
    public static function __callStatic($name, $arguments) {   
        // 参数 $name 大小写敏感   
        echo “Calling static method ‘$name’ ” . implode(‘, ‘, $arguments). “\n”;   
    }   
}   
$obj = new MethodTest;   
$obj->runTest(‘in object context’);   
MethodTest::runTest(‘in static context’);  // As of PHP 5.3.0 

1.6 新增Nowdoc语法

用法和Heredoc类似,但使用单引号。Heredoc则需要通过使用双引号来声明。 Nowdoc中不会做任何变量解析,非常适合于传递一段PHP代码。

    // Nowdoc 单引号 PHP 5.3之后支持   
    $name = ‘MyName’;   
    echo <<<'EOT'   
    My name is “$name”.   
    EOT;   
    //上面代码输出 My name is “$name”. ((其中变量不被解析)   
    // Heredoc不加引号   
    echo <<    Hello World!   
    FOOBAR;   
    //或者 双引号 PHP 5.3之后支持   
    echo <<<"FOOBAR"   
    Hello World!   
    FOOBAR;

支持通过Heredoc来初始化静态变量、类成员和类常量。

// 静态变量   
function foo()   
{   
    static $bar = <<Nothing in here…   
LABEL;   
}   
// 类成员、常量   
class foo   
{   
    const BAR = <<Constant example   
FOOBAR;   
   
    public $baz = <<Property example   
FOOBAR;   
}

1.7 在类外也可使用const来定义常量

//PHP中定义常量通常是用这种方式 
define(“CONSTANT”, “Hello world.”); 
 
//并且新增了一种常量定义方式 
const CONSTANT = ‘Hello World’;

1.8 三元运算符增加了一个快捷书写方式

原本格式为是(expr1) ? (expr2) : (expr3) ; 如果expr1结果为True,则返回expr2的结果。
PHP5.3新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3 ; 如果expr1结果为True,则返回expr1的结果 

//原格式 
$expr=$expr1?$expr1:$expr2 
//新格式 
$expr=$expr1?:$expr2

1.9 HTTP状态码在200-399范围内均被认为访问成功

1.10支持动态调用静态方法

class Test{   
    public static function testgo()   
    {   
        echo “gogo!”;   
    }   
}   
$class = ‘Test’;   
$action = ‘testgo’;   
$class::$action();  //输出 “gogo!” 

2 PHP5.3中其它值得注意的改变

1.1 修复了大量bug
1.2 PHP性能提高
1.3 php.ini中可使用变量
1.4 mysqlnd进入核心扩展 理论上说该扩展访问mysql速度会较之前的MySQL 和 MySQLi 扩展快(参见http://dev.mysql.com/downloads/connector/php-mysqlnd/
1.5 ext/phar、ext/intl、ext/fileinfo、ext/sqlite3和ext/enchant等扩��默认随PHP绑定发布。其中Phar可用于打包PHP程序,类似于Java中的jar机制。

1.6 ereg 正则表达式函数 不再默认可用,请使用速度更快的PCRE 正则表达式函数

3 弃用功能

PHP 5.3.0 新增了两个错误等级: E_DEPRECATED 和 E_USER_DEPRECATED. 错误等级 E_DEPRECATED 被用来说明一个函数或者功能已经被弃用. E_USER_DEPRECATED 等级目的在于表明用户代码中的弃用功能, 类似于 E_USER_ERROR 和 E_USER_WARNING 等级.

下面是被弃用的 INI 指令列表. 使用下面任何指令都将导致 E_DEPRECATED 错误.
define_syslog_variables
register_globals
register_long_arrays
safe_mode
magic_quotes_gpc
magic_quotes_runtime
magic_quotes_sybase
弃用 INI 文件中以 ‘#’ 开头的注释.

弃用函数:
call_user_method() (使用 call_user_func() 替代)
call_user_method_array() (使用 call_user_func_array() 替代)
define_syslog_variables()
dl()
ereg() (使用 preg_match() 替代)
ereg_replace() (使用 preg_replace() 替代)
eregi() (使用 preg_match() 配合 ‘i’ 修正符替代)
eregi_replace() (使用 preg_replace() 配合 ‘i’ 修正符替代)
set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime()
session_register() (使用 $_SESSION 超全部变量替代)
session_unregister() (使用 $_SESSION 超全部变量替代)
session_is_registered() (使用 $_SESSION 超全部变量替代)
set_socket_blocking() (使用 stream_set_blocking() 替代)
split() (使用 preg_split() 替代)
spliti() (使用 preg_split() 配合 ‘i’ 修正符替代)
sql_regcase()
mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)
mysql_escape_string() (使用 mysql_real_escape_string() 替代)
废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代.
mktime() 的 is_dst 参数. 使用新的时区处理函数替代.
弃用的功能:
弃用通过引用分配 new 的返回值.
调用时传递引用被弃用.

 

CentOS 6.3 安装LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm

在部署LNMP的时候遇到Nginx启动失败的2个问题 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu安装Nginx php5-fpm MySQL(LNMP环境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

《细说PHP》高清扫描PDF+光盘源码+全套教学视频 http://www.linuxidc.com/Linux/2014-03/97536.htm

CentOS 6中配置PHP的LNMP的开发环境  http://www.linuxidc.com/Linux/2013-12/93869.htm

PHP 的详细介绍请点这里
PHP 的下载地址请点这

PHP 单引号与双引号的区别

在PHP中,字符串的定义可以使用英文单引号’ ‘,也可以使用英文双引号” “。

但是必须使用同一种单或双引号来定义字符串,如:’Hello World”和”Hello World’为非法的字符串定义。

单引号和双引号到底有啥区别呢?

PHP允许我们在双引号串中直接包含字串变量。

而单引号串中的内容总被认为是普通字符,因此单引号中的内容不会被转义效率更高。

比如:
$str=’hello’;
echo “str is $str”; //运行结果: str is hello
echo ‘str is $str’; //运行结果: str is $str

php中,双引号中的变量($var)和特殊字符(\r\n之类)会被转义,单引号中的内容不会被转义(所以效率更高)。
使用上的话,
我以前很喜欢在sql字符串里这样写$sql = “SELECT * FROM table WHERE id = $id”,这样里面的$id可以被转义,单引号就不行。

在JavaScript中 单引号 和双引号没有区别,只要成对使用就行。
我在JavaScript 中使用单引号大多是因为 Javascript 和 HTML 打交道比较多,输出 HTML 片段的时候不需要转义 HTML 中属性的引号。
总之,看实际情况来用啦,怎么方便怎么使用。

CentOS 6.3 安装LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm

在部署LNMP的时候遇到Nginx启动失败的2个问题 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu安装Nginx php5-fpm MySQL(LNMP环境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

《细说PHP》高清扫描PDF+光盘源码+全套教学视频 http://www.linuxidc.com/Linux/2014-03/97536.htm

CentOS 6中配置PHP的LNMP的开发环境  http://www.linuxidc.com/Linux/2013-12/93869.htm

PHP 的详细介绍请点这里
PHP 的下载地址请点这

Linux下使用PHP时由参数“b”的想到的

<

div id=”content” contentScore=”1171″>  在使用PHP的时候,以前有时会用到fopen(), 现在经常用file_get_contents(),当时看到他们的参数表中都有”b”这个参数,那个时候也没多留意,只知道是二进制(binary)的意思。最近特地观察了下,才发现这个参数原来是指定打开的文件是否二进制文件,再说的正确些,指的是是否以二进制方式打开文件。

  进一步研究后又得到了一些结果,因为Linux对于二进制文件和文本文件并不区分,所以在Linux下使用上述两个函数时加不加”b”这个参数并无区别,但是在Windows下就有区别了。当Windows以二进制方式打开一个文件时和Linux是一样的,但是当以文本方式打开文件是,会自动对文件做一些转换(translate),一个例子是换行符。在Linux中换行符是”\n”,无论是二进制文件还是文本文件都是如此。但是在Windows 中,文本文件里的换行符是”\r\n”,这就会造成一些文件操作时的麻烦,所以漯div>

Linux下为PHP添加扩展库

<

div id=”content” contentScore=”1836″>以php curl 扩展库编译为例。

本次编译只是单独编译php的扩展库,然后将编译好的php扩展库加到现在运行的php中,不对现在运行的php重新编译,所以对现在运行的php没有任何影响。

假如原先编译的php目录在/usr/local/php4目录下;apache在/usr/local/apache2目录下;php源代码在/home/php-4.4.7目录下。如果实际目录与假定的目录不一致,则在下面的命令中做调整。

  1. 找到当前运行的php版本的源代码目录,如 php-4.4.7。进入curl扩展库目录。

$cd /home/php-4.4.7/ext/curl

  1. 调用phpize程序生成编译配置文件。

$/usr/local/php4/bin/phpize

  1. 编译扩展库,分别执行下面的configure和make命令。

$./configure –with-php-config=/usr/local/php4/bin/php-config

##configure这一步执行通过后,再执行make命令,如果configure执行不通过,则查找错误原因。

$make

##make成功执行后,生成的扩展库文件在当前目录的 modules 子目录下,

如 /home/php-4.4.7/ext/curl/modules/curl.so

  1. 配置php.ini文件

##将编译好的扩展库文件复制到apache2 modules目录下。

$cp /home/php-4.4.7/ext/curl/modules/curl.so /usr/local/apache2/modules/.

##可以通过查看phpinfo信息来确定php.ini文件位置,然后编辑。

##在php.ini文件中找到设置扩展目录的位置,然后将扩展路径设置到apache2 modules目录下。

extension_dir = “/usr/local/apache2/modules/”

##在php.ini的添加扩展库位置,设置要添加的扩展库。

extension=curl.so

##以后如果还要添加别的扩展库的话,则只需先将php扩展库编译好,然后copy到apache2 modules目录下,

##然后再在这个位置\/div>

PHP中处理浮点数的一些方法记录

请不要在程序中直接使用等号、大于、加、减、乘、除等操作浮点数,如果需要对浮点数进行以上操作,请使用下面的BC系列函数。以确保准确性及精度。

两个高精度数比较大小

int bccomp ( string $left_operand , string $right_operand [, int $scale ] )

left=right 返回 0

leftright 返回 1

$scale 需要比较的精度,即小数点后多少位

两个高精度数相加

string bcadd ( string $left_operand , string $right_operand [, int $scale ] )

$scale 相加后,返回几位小数

两个高精度数相减

string bcsub ( string $left_operand , string $right_operand [, int $scale ] )

$scale 相减后,返回几位小数

两个高精度数求余/取模

string bcmod ( string $left_operand , string $modulus )

两个高精度数相除

string bcdiv ( string $left_operand , string $right_operand [, int $scale ] )

$scale 相除后,返回几位小数

两个高精度数相乘

string bcmul ( string $left_operand , string $right_operand [, int $scale ] )

$scale 相乘后,返回几位小数

两个高精度数的次方值

string bcpow ( string $left_operand , string $right_operand [, int $scale ] )

$scale 次方,返回几位小数

高精度数的平方根

string bcsqrt ( string $operand [, int $scale ] )

$scale 返回几位小数

设置bc函数的小数点位数

bool bcscale ( int $scale )

$scale 几位小数