php质量
‘壹’ php到底有多糟糕
php是web开发第一语言,这已经是坐稳了的事实,因为使用简单,工具完善,开发效率高等优点为它积聚了大量的粉丝,号称世界上最好的语言。 然而,就算是世界上最好的语言也有缺陷,下面我挑几个php语法层面不那么好用的特性吐槽下。
变量面前的美元($)符号
我想不明白当初php语言的设计师是怎么想的,为什么非要在变量名面前加上这个美元符号?每次我书写变量时必须要按一下shift +4键,用其它语言可以很流畅的写代码,在php中却老是被按这个shift打断整个过程,这除了能给程序员带来麻烦,我实在看不到有其它一丁点的好处。网上流传着的说法好像是因为带美元符号代码解析起来更容易, 性能更好。但是解释类型的语言又不只有php ,为什么其它语言就不用让程序员打这个讨厌的美元符号。每天看着满屏的美元符号,我口袋里的钱也没见多一分呀。
访问对象成员要使用箭头符号
明明按一下点号(.)就可以方便快捷的搞定的问题,却非要使用简单符号(->)来代替,真的是借我一百个脑袋也想不明白php设计者在设计这个特性是什么逻辑。难不成是因为php解释器最终会把php的代码转换成c代码执行,而c中访问指针的成员就是使用箭头符号的。如果是这样那显然是php的设计者们偷懒了,难到不能在转换成c执行的过程中多一步将点号转换为箭头符号的过程吗?不要告诉我又是因为性能问题而办不到,他们就不能为程序员想想?
数组即能当列表也能当字典
写一个函数,返回一个数组类型,但是在函数的外面,鬼知道这个数组是一个list还是一个map?写php代码不知道被这个特性坑过多少回,如果是别人写的函数, 又没有注释,那非得跑进函数里看个明白才知道应该这么样使用这个函数才是安全的。难到就不能把array拆成两个独立的类型分别代表list(列表)和map(字典)吗?这能为程序提供很大的便利,写的代码也更加不会出错。
匿名函数使用外部变量必须使用use关键字导入
这个特性不能说完全没有优点,对于代码的可维护性还是能起到正面的作用的,因为这么做能让我知道我在匿名函数体里面对于外部会有哪些依赖,让代码更可控。然而,这种写法真的是非常的不方便,每次写lambda时,要用到外部的变量时,都要使用use导入,把代码搞的看起来很臃肿,而且,因为其它语言没这个限制,习惯已经养成,所以每次都会忘记使用use导入,导致代码出错,增加排查问题的时间,这真的不是什么好玩的事。
用include导入文件
当把代码模块化时,然后在其它文件中使用,每次都需要使用这个include把文件导入进来,而且还要考虑路径的问题,在结构复杂的项目中,非常让人蛋疼。而像Java和Python之类的语言中,代码管理机制设计的非常好,想用什么import进来就可以了,根本不用考虑路径啊,文件名大小写啊之类的问题,能大大的提升开发效率。虽然,有框架可以解决这类问题,但毕竟是外部实现,使用起来总归不是那么顺畅。这也算是php一个比较大的毛病了。
总结的这五点算是php中存在问题的典范了,希望php团队能加把劲,把这些问题在未来的版本中优化掉,让开发者写代码时有更好的体验,更高的效率,让世界上最好的语言名副其实
‘贰’ PHP好还是ASP好——对于网站做SEO来说
PHP(外文名:PHP: Hypertext
Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP
独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
PHP优势
开放源代码
所有的PHP源代码事实上都可以得到。
免费性
和其它技术相比,PHP本身免费且是开源代码。
快捷性
程序开发快,运行快,技术本身学习快。嵌入于HTML:因为PHP可以被嵌入于HTML语言,它相对于其他语言。编辑简单,实用性强,更适合初学者。
跨平台性强
由于PHP是运行在服务器端的脚本,可以运行在UNIX、LINUX、WINDOWS、Mac OS、Android等平台
效率高
PHP消耗相当少的系统资源。
图像处理
用PHP动态创建图像,PHP图像处理默认使用GD2。且也可以配置为使用image magick进行图像处理。
面向对象
在php4,php5 中,面向对象方面都有了很大的改进,php完全可以用来开发大型商业程序。
专业专注
PHP支持脚本语言为主,同为类C语言。
ASP是动态服务器页面(Active Server
Page)的英文缩写。是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单、方便的编程工具。ASP的网页文件的格式是
.asp。现在常用于各种动态网站中。
ASP的特点
Active
ASP使用了Microsoft的ActiveX技术。ActiveX(COM)技术是现在Microsoft软件的重要基础。它采用封装对象,程序调用对象的技术,简化编程,加强程序间合作。ASP本身封装了一些基本组件和常用组件,有很多公司也开发了很多实用组件。只要你可以在服务器上安装这些组件,通过访问组件,你就可以快速、简易地建立自己的WEB应用。
Server
ASP运行在服务器端。这样就不必担心浏览器是否支持ASP所使用的编程语言。ASP的编程语言可以是VBSCRIPT和
JSCRIPT。VBSCRIPT是VB的一个简集,会VB的人可以很方便的快速上手。然而Netscape浏览器不支持客户端的VBSCRIPT,所以最好不要在客户端使用VBSCRIPT。而在服务器端,则无需考虑浏览器的支持问题。Netscape浏览器也可以正常显示ASP页面。
Pages
ASP返回标准的HTML页面,可以正常地在常用的浏览器中显示。浏览者查看页面源文件时,看到的是ASP生成的HTML代码,而不是ASP程序代码。这样就可以防止别人抄袭程序。由此我们可以看出,ASP是在IIS下开发WEB应用的一种简单、方便的编程工具。在了解了VBSCRIPT的基本语法后,只需要清楚各个组件的用途、属性、方法,就可以轻松编写出自己的ASP系统。
‘叁’ 高质量PHP代码的50个技巧(3)
42
43
44
45
/**
Method to execute a command in the terminal
Uses :
1. system
2. passthru
3. exec
4. shell_exec
*/
function terminal($command)
{
//system
if(function_exists('system'))
{
ob_start();
system($command , $return_var);
$output = ob_get_contents();
ob_end_clean();
}
//passthru
else if(function_exists('passthru'))
{
ob_start();
passthru($command , $return_var);
$output = ob_get_contents();
ob_end_clean();
}
//exec
else if(function_exists('基悔exec'))
{
exec($command , $output , $return_var);
$output = implode(" " , $output);
}
//shell_exec
else if(function_exists('shell_exec'))
{
$output = shell_exec($command) ;
}
else
{
$output = 'Command execution not possible on this system';
$return_var = 1;
}
return array('output' => $output , 'status' => $return_var);
}
terminal('ls');
上面的函数将运行shell命令, 只要有一个系统函数可用, 这保持了代码的一致性.
5. 灵活编写函数
?
1
2
3
4
5
6
function add_to_cart($item_id , $qty)
{
$_SESSION['cart']['item_id'] = $qty;
}
add_to_cart( 'IPHONE3' , 2 );
使用上面的函数添加单个项目. 而当添加项列表的时候,你要创建另一个函数吗? 不用, 只要稍加留意不同类型的参数, 就宽好会更灵活. 如:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
慎锋铅14
15
16
function add_to_cart($item_id , $qty)
{
if(!is_array($item_id))
{
$_SESSION['cart']['item_id'] = $qty;
}
else
{
foreach($item_id as $i_id => $qty)
{
$_SESSION['cart']['i_id'] = $qty;
}
}
}
add_to_cart( 'IPHONE3' , 2 );
add_to_cart( array('IPHONE3' => 2 , 'IPAD' => 5) );
现在, 同个函数可以处理不同类型的输入参数了. 可以参照上面的例子重构你的多处代码, 使其更智能.
6. 有意忽略php关闭标签
我很想知道为什么这么多关于php建议的博客文章都没提到这点.
?
1
2
3
<?php
echo "Hello";
//Now dont close this tag
这将节约你很多时间. 我们举个例子:
一个 super_class.php 文件
?
1
2
3
4
5
6
7
8
9
<?php
class super_class
{
function super_function()
{
//super code
}
}
?>
//super extra character after the closing tag
index.php
?
1
2
require_once('super_class.php');
//echo an image or pdf , or set the cookies or session data
这样, 你将会得到一个 Headers already send error. 为什么? 因为 “super extra character” 已经被输出了. 现在你得开始调试啦. 这会花费大量时间寻找 super extra 的位置。因此, 养成省略关闭符的习惯:
?
1
2
3
4
5
6
7
8
9
<?php
class super_class
{
function super_function()
{
//super code
}
}
//No closing tag
这会更好.
7. 在某地方收集所有输入, 一次输出给浏览器
这称为输出缓冲, 假如说你已在不同的函数输出内容:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function print_header()
{
echo "<p id='header'>Site Log and Login links</p>";
}
function print_footer()
{
echo "<p id='footer'>Site was made by me</p>";
}
print_header();
for($i = 0 ; $i < 100; $i++)
{
echo "I is : $i ';
}
print_footer();
替代方案, 在某地方集中收集输出. 你可以存储在函数的局部变量中, 也可以使用ob_start和ob_end_clean. 如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function print_header()
{
$o = "<p id='header'>Site Log and Login links</p>";
return $o;
}
function print_footer()
{
$o = "<p id='footer'>Site was made by me</p>";
return $o;
}
echo print_header();
for($i = 0 ; $i < 100; $i++)
{
echo "I is : $i ';
}
echo print_footer();
为什么需要输出缓冲:
>>可以在发送给浏览器前更改输出. 如 str_replaces 函数或可能是 preg_replaces 或添加些监控/调试的html内容.
>>输出给浏览器的同时又做php的处理很糟糕. 你应该看到过有些站点的侧边栏或中间出现错误信息. 知道为什么会发生吗? 因为处理和输出混合了.
8. 发送正确的mime类型头信息, 如果输出非html内容的话.
输出一些xml.
?
1
2
3
4
5
6
$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
$xml = "<response>
<code>0</code>
</response>";
//Send xml data
echo $xml;
工作得不错. 但需要一些改进.
?
1
2
3
4
5
6
7
$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
$xml = "<response>
<code>0</code>