PHPer的进阶探索之旅

目录

前言

  作为一个PHPer,一直认为Java与PHP都“差不多”,尽管身边的人会说大型网站是Java搭起来的,或者Java工程师的起薪会比PHP工程师高。但是我还是不以为然,尽管这就是事实。所以会向自己灌输一种思想:语言只是一种工具。最后成功与否全靠自己。哪一个方向深入了,成为专家那便无人能及,不关乎语言,只在乎思想。当然我也会苦恼,苦恼于寻找不到快速提升自己的能力的方法,至少能稳步提升的途径也木有感受到。此前能让自己觉得能力在快速提升的时候大都是在学新技术的时候。可以认为我是在广度的学习,而没有深度。如今显得有点尴尬。因此,我也建议自己开始往某一方向深入的学习,祈祷能无人企及,有点奢望的味道。那么除了加油,还能做些什么?
  下面将贴出自己近来阅读过的文章或文档,可能的话会在下面列出自己阅读之后的总结或感受。

魔术常量

原文:魔术常量
  PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
  有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:

名称说明
__LINE__文件中的当前行号。
__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
__FUNCTION__函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
__TRAIT__Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
__METHOD__类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

  主要说明:
(1)__FUNCTION____METHOD__
案例:

<?php

    class Test
    {
        public function getFuncName()
        {
            echo __FUNCTION__;
        }

        public function getFuncNameAgain()
        {
            echo __METHOD__;
        }
    }

    $obj = new Test();
    $obj->getFuncName();      // 输出:getFuncName
    echo '<br/>';
    $obj->getFuncNameAgain(); // 输出:Test::getFuncNameAgain

(2)__CLASS__get_class方法
案例:

<?php
    class SuperClass
    {
        public function sayA()
        {
            echo "'a' - said the " . __CLASS__ . "<br/>";
        }

        public function sayB()
        {
            echo "'b' - said the " . get_class($this) . "<br/>";
        }
    }

    class ChildClass extends SuperClass
    {
        public function sayA()
        {
            parent::sayA();
            echo "'a' - said the " . __CLASS__ . "<br/>";
        }

        public function sayB()
        {
            parent::sayB();
            echo "'b' - said the " . get_class($this) . "<br/>";
        }
    }

    $child = new ChildClass();
    $child->sayA();
    $child->sayB();
    'a' - said the SuperClass
    'a' - said the ChildClass 

    'b' - said the ChildClass
    'b' - said the ChildClass
看出区别了吧?!

PHP常量详解:define和const的区别

原文:PHP常量详解:define和const的区别
总结:
1. const是一种语法结构,而define是一个函数。const解析起来比define快得多;
2. const支持定义类中的成员变量,而define则不可以;
3. const不能用于条件结构,否则会报语法错误,解析失败,而define则可以;
4. const不能用于类的函数中,否则同样会报语法错误,而define则可以;
5. const不能通过表达式定义常量,而define则可以采用表达式作为名称;
6. const定义的常量的值必须是静态标量,而define定义的常量值可以采用任何表达式的值;
7. const定义的常量大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。

PHP中的闭包

  在JavaScript中闭包指的是有权访问另一个函数作用域中的变量的函数。那在PHP中闭包又是一个什么样的概念呢?与JavaScript中的闭包又有何不同呢?快让我们一起一探究竟吧!
  闭包,其实是一种语言特性,它是指的是程序设计语言中,允许将函数看作对象,然后能像在对象中的操作搬在函数中定义实例(局部)变量,而这些变量能在函数中保存到函数的实例对象销毁为止,其它代码块能通过某种方式获取这些实例(局部)变量的值并进行应用扩展。

注:PHP的闭包(Closure)也就是匿名函数。是PHP5.3引入的。
  匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。
  这里扣一个栗子在这里讲下:

$func = function(){
    echo '<p>Hello world!!</p>';
};//这里必须要有;结尾
$func();

  匿名函数赋值给一个变量,再通过该变量进行调用。升级:

function pfunc() {
    $func = function(){
        echo '<p>Hello world!!</p>';
    };//这里必须要有;结尾
    return $func;
}
$func = pfunc();
$func();

  这函数内部定义匿名函数,并将匿名函数作为函数的返回结果返回,最后在函数外部进行执行。对于在个匿名函数或闭包函数来说,如何调用外部环境的变量呢?在JS的闭包中内部函数可以直接访问外部函数的变量,那么在PHP中是否可以直接访问、直接调用呢?答案是否定的。在PHP中需要使用到use关键字,传递外部函数的变量供闭包函数使用。如:

function pfunc() {
    $name = 'DreamBoy';
    $func = function() use($name) {
        echo '<p>Hello world!!</p>';
        echo "<p>Hello $name!!</p>";
    };//这里必须要有;结尾
    return $func;
}
$func = pfunc();
$func();

  在JS中闭包函数可以访问外部函数的变量,并进行修改,修改变量的值当然也会改变外部函数变量的值。那在PHP这样的操作能否实现想要的效果呢?同样也是不可以的。如:

function pfunc() {
    $name = 'DreamBoy';
    $num = 0;
    $func = function() use($name, $num) {
        echo '<p>Hello world!!</p>';
        echo "<p>Hello $name!!</p>";
        $num++;
        echo "<p>func's num is ${num}.</p>";
    };
    $func();
    echo "<p>pfunc's num is ${num}.</p>";
}
pfunc();

  那么应该如何操作呢?实际上,应该向函数传递参数一般,传递变量的引用。如:

function pfunc() {
    $name = 'DreamBoy';
    $num = 0;
    $func = function() use($name, &$num) {
        echo '<p>Hello world!!</p>';
        echo "<p>Hello $name!!</p>";
        $num++;
        echo "<p>func's num is ${num}.</p>";
    };
    $func();
    echo "<p>pfunc's num is ${num}.</p>";
}
pfunc();

  另外一点:与JS不同的是,闭包函数中this指针指向问题。

class Test
{
    public function testing()
    {
        return function() {
            var_dump($this);
            return $this;
        };
    }
    public function out()
    {
        echo '<h3 style="color: #ABCDEF;">This is Test Class.</h3>';
    }
}

$object = new Test;
$function = $object->testing();
$t = $function(); // 这个与JS有所不同this指针的问题。
$t->out();

  在PHP5.4.0以上(包括5.4),当前类对自动绑定类的上下文。在这里返回的闭包函数中的$this同样指向的是当前创建的对象$object
  另外两个需要注意的是:“解除递归函数”、“关于延迟绑定”。参考:PHP的闭包
    

「PSR 规范」

原文:

以下是一个占位符使用的例子:

/**
* 用上下文信息替换记录信息中的占位符
*/
function interpolate($message, array $context = array())
{
  // 构建一个花括号包含的键名的替换数组
  $replace = array();
  foreach ($context as $key => $val) {
      $replace['{' . $key . '}'] = $val;
  }

  // 替换记录信息中的占位符,最后返回修改后的记录信息。
  return strtr($message, $replace);
}

// 含有带花括号占位符的记录信息。
$message = "User {username} created";

// 带有替换信息的上下文数组,键名为占位符名称,键值为替换值。
$context = array('username' => 'bolivar');

// 输出 "Username bolivar created"
echo interpolate($message, $context);

PHP命令空间

原文:PHP命名空间(Namespace)的使用详解

Web性能优化与HTTP/2

原文:Web性能优化与HTTP/2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值