0
点赞
收藏
分享

微信扫一扫

PHPer的进阶探索之旅


目录

  • ​​目录​​
  • ​​前言​​
  • ​​魔术常量​​
  • ​​PHP常量详解define和const的区别​​
  • ​​PHP中的闭包​​
  • ​​PSR 规范​​
  • ​​PHP命令空间​​
  • ​​Web性能优化与HTTP2​​


前言

  作为一个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的闭包​​
  • ​​小白教你玩转php的闭包​​

注: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 规范」

原文:

  • ​​PHP 标准规范​​

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

/**
* 用上下文信息替换记录信息中的占位符
*/
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);

举报

相关推荐

0 条评论