目录
前言
作为一个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);