上网搜索了一下,发现许多帖子基本都抄的一样,说什么这是由于 php5.3版本后,要求继承类必须在父类之后定义,如果父类定义在前,继承类在后,就不会出现这个错误。尤其是http://bugs.php.net/bug.php?id=46851上面还煞有介事的给出了正反例:
代码如下 | 复制代码 |
<?php class cc extends c { function test() { return null; } } $cc = new cc(); class c { function test( $a ) { return 1; } } $cc = new cc(); |
并且讨论了出错的情况多半是由于用_autoload()对类进行自动的include,导致基类的定义在后面,子类定义在前面。
我看了下自己的代码,虽然确实也用到了autoload,但是都是显式的先导入了几个基类,并不存在这样的情况,而且将上面的正反例子试了一下,都会出现E_STRICT的警告。
再看例子
代码如下 | 复制代码 |
<?php abstract class A { // 方法无参数 public static function foo(){ echo 'bar'; } } abstract class B extends A { // 方法有参数 public static function foo($str){ echo $str; } } ?> |
闪电似的
如上面的代码:类A中的foo方法无参数,类B在继承A后重写foo方法时加入了参数,因此会产生一个类似下面E_STRICT级别的警告:
Strict standards: Declaration of ... should be compatible with that of
代码如下 | 复制代码 |
<?php abstract class A { // 方法无参数 public static function foo(){ echo 'bar'; } } abstract class B extends A { // 方法有参数 public static function foo($str = NULL){ echo $str; } } ?> |
类B在重写foo方法时为新加入的参数指定一个默认值即可
真正原因:
其实如果子类重写方法的参数和基类不一样,只要给参数个默认值,使得编译器认为参数可以为空,保持重写方法与基类方法的函数签名相同就可以了。
经常用JAVA的同学肯定知道,在JAVA或者C++中,重写方法的函数签名本应该就和基类函数是一致的,我认为这也是符合自然规律的,因为override本来就是覆盖的意思嘛,既然覆盖了,那么就应该和原函数一致,不然怎么能“盖”的住呢~并且方法的重写多用在重写虚函数或者更明白的说就是重写接口的函数,如果重写的时候函数签名都不一致了,还要接口干嘛呢。。。
所以PHP的新版本中,我觉得定义这个E_STRICT的警告错误是很有用处的,要提醒程序员自己的重写方法到底对不对。
最后还是鄙视一下上面那些抄来抄去的帖子,如果某个语言连基类和子类定义的顺序都不能打乱,说明这个编译器非常有问题了,显然是bug。
php中数组合并array_merge是最靠得住的函数了,下文我们在利用array_merge函数合并时主要是对于两个数组的键值为数字进行处理。先要了解一个基础知识点
PHP中两个数组合并可以使用+或者array_merge,但之间还是有区别的,而且这些区别如果了解不清楚项目中会要命的!
主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意
1)键名为数字时,array_merge()后面的值将不会覆盖原来的值,而是附加到后面,但+合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖)
2)键名为字符串时,array_merge()此时会覆盖掉前面相同键名的值,但+仍然把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖)。
代码如下 | 复制代码 |
$a = array('a', 'b'); //输出: array array ++++++++++++++++++++++++++++++++++++++++++ //输出: array array ++++++++++++++++++++++++++++++++++++++++++ $a = array('a', 'b'); //输出: array ++++++++++++++++++++++++++++++++++++++++++ $a = array( 输出: array array |
好了讲到这么多了我们来看看下合并2个数字键数组的值
代码如下 | 复制代码 |
<?php $arr1 = array('aa', 'bb', 'cc'); $arr = new_array_merge($arr1, $arr2); 输出: Array |
Drupal开发中需要那些技能呢?来,先看一下大屏幕(下图)
按照上面的图示,大概列了一个表:
技术方向 | 详细说明 |
---|---|
社区人员 | Drupal.org账号、发帖、组织和参加线下聚会、QQ群等 |
内容编辑 | 网站的评论、内容、自动发布、审核等技能。menus, users, blocks, front page settings |
站点配置人员 | 普通设置:网站的 menus, users, blocks, 首页、权限等配置。 高级设置:Views,以及重要的模块,如Panels, Skinnr, Context, Simple Views。 |
一般站长 | 基本技能:安装Drupal, 配置fields, 创建简单的views, 安装和设置一些模块,如:References, Scheduler and Automatic Nodetitles等等。 高级技能:Views配置,一些高级模块的使用,如:Page manager, Rules, Organic Groups, Commerce以及权限控制模块等。 白金级别:Drupal多站点的安装,Drupal设置的导出、导入,如features。 |
代码开发 | 基本模块的开发,能写Views plugin/handlers,理解Drupal的运行逻辑系统,能开发Drupal的权限、模版、数据操作等模块,并且能对Drupal的核心进行hack。(对Hack!) |
前端开发 | 基本级别:主题创建、子主题创建、基本的CSS修改、模版文件修改等。 高级级别: 相应试设计, Grid布局, jQuery等。 白金级别: js、ajax、ahah、HTML5、app等。 |
服务器管理 | 基础级别:服务器的安装、apache、mysql、php,以及文件权限设置等安装运维。 中等级别: 服务器的持续集成,自动化测试、网站备份(如:运用Drupal模块的备份)等。 高级级别: 网站安全、模块升级、代码安全(svn、git)、Drupal文件的备份等等 seo/seo.html" target="_blank">网站优化: 内存使用、内存泄漏、CPU利用率、数据库慢查询,反向代理、缓存、负载均衡等等。 |
其他相关 | 需求管理(分析、整理、文档),项目管理(管理项目、Roadmap、管理平台的使用),任务划分,交互设计、市场调查、SEO策略、内容策略等等 |
以上是参考Drupal.org上的内容,大概列举的,不过我们可以看出,不同的方向所需要的技能还是不一样的,本站的博客关注网站后端一些,也就是从服务器、数据库、性能甚至SEO、市场策略,前端、模块安装相对比较少。
可见,我们要学习更多的技能,才能开发出一个很拽的网站 优秀的程序员,写出来的代码不但具有高效的运行速度,也同时具有很强的可读性。下面我们就php来讲讲程序代码的规范性,使程序员具体良好的编程习惯,也让项目具有更好的可维护性。
本文以PHP语言为例,介绍一些良好的编程习惯,希望能够对你有所帮助。
1. 规划代码结构
优秀的PHP代码应该有清晰的结构。PHP面向对象的特性允许程序员将应用程序分解为函数或方法。如果代码晦涩难懂,你也可以添加注释,使代码的功能一目了然。编码时应尽量将前端代码(HTML/CSS/JavaScript)与应用程序的服务端规则分开,或者你可以使用遵循MVC模式的PHP框架来构建你的应用程序。
2. 编码风格统一
优秀的PHP代码应该具备统一的风格。比如,为变量和函数制定统一的命名规则,为循环任务(比如数据库存取、错误处理)制定统一的接入标准,或者保持有规律的代码缩进,这些编码习惯都可以让别人阅读代码更加轻松。
3. 可移植性
优秀的PHP代码应该具有可移植性。程序员应学会运用PHP现有的特性(比如魔术引号和短标签等),应该了解产品需求,适应PHP的特点,保证写出的PHP代码具有可移植性和跨平台性。
4. 代码安全性
优秀的PHP代码应该具有安全性。PHP5具有卓越的特性和灵活性,但应用程序的安全往往掌握在程序员的手中。作为专业的PHP开发人员,应该对安全漏洞有一些深入了解,常见的安全漏洞有跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、代码注入漏洞和字符编码漏洞等。使用PHP中的特定功能和函数(比如mysql_real_escape_string等)可以帮助程序员写出安全的代码。
5. 添加注释
代码注释是代码中的重要组成部分,它解释了函数运行的目的,这种注释会在代码以后的维护中提供非常有用的帮助。
6. 避免简写标记
应使用完整的起始标记,不推荐使用简写的起始标记。
7. 用单引号代替双引号
由于PHP会对双引号中的内容进行变量搜索,为了避免这种搜索带来的性能影响,程序员应该使用单引号引用字符串。
8. 转义输出
应该在htmlspecialchars函数中使用ENT_QUOTES参数,保证单引号(')也可以被转义。尽管没有规定必须这样做,但这是一个好习惯。
9. 使用逗号隔开字符串输出
字符串连接符(.)可以将单一的字符串传递给echo语句进行输出,与之相比,逗号可以实现echo语句中字符串的分别输出,这对PHP来说是一个性能改善。
10. 在输出前检查传递值
应该记得在输出前检查$_GET['query'] 的传递值。使用isset函数或是empty函数可以检查变量值是否为空。
这里就就给大家详细说一下PHP流程控制的替代语法。什么是替代语法?
简单的说就是一些语法的另类写法。
PHP中那些语法有替代语法?
流程控制(包括if,while,foreach,switch)这几个语句有替代语法。
替代语法的基本形式:
左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;
举个例子吧:
举个例子吧:
<?php if ($a<0): ?>
是负数拉
<?php endif; ?>
上面的语句等同于
<?php if ($a<0){ ?>
是负数拉
<?php } ?>
是负数拉
为什么纯PHP代码里面几乎看不到?
这些语法有点不符合C家族的传统有点另类,大家不大习惯于这种语法,而且不是很方便
大家都不习惯,而且这么另类要他有什么用?蛋疼吗?
存在就是合理,它自有它的用处,这些语法能发挥的地方是在PHP和HTML混合页面的代码里面。好处如下:
1.使HTML和PHP混合页面代码更加干净整齐。
有代码洁癖的朋友最惧怕的就是乱七八糟的混合代码,有了这些没有花括号的替代语法,各位爱干净的朋友开心到尿震。
2.流程控制逻辑更清晰,代码更容易阅读
要改别人的PHP和HTML混合代码,打开发现,我擦!太TMD垃圾了!如果用替代语法,我想再垃圾的程序开发人员也不至于写的太乱吧。
3.一些从ASP等其他类basic语言家族转来的朋友,会更容易使用PHP。
讲半天没用的,捞点干的行不?这东西怎么用?
根据之前描述的使用方法,if语句的替代语法使用如下:
<?php if ($a == 5): ?>
<div>等于5</div>
<?php elseif ($a == 6): ?>
<div>等于5</div>
<?php else: ?>
<div>不是5就是6</div>
<?php endif; ?>
while替代语法:
<?php while (expr): ?>
<li>循环点什么</li>
<?php endwhile; ?>
for替代语法:
<?php for (expr1; expr2; expr3): ?>
<li>循环点什么</li>
<?php endfor; ?>
foreach替代语法:
<?php foreach (expr1): ?>
<li>循环点什么</li>
<?php endforeach; ?>
switch替代语法:
<?php
switch ($i):
case 0:
echo “i equals 0″;
break;
case 1:
echo “i equals 1″;
break;
case 2:
echo “i equals 2″;
break;
default:
echo “i is not equal to 0, 1 or 2″;
endswitch;
?>