11月28, 2008

再学php

初学php是在大三。在看了STL,Ruby,JavaScript之后,再看php和当初完全是两种感觉了。

Array, Hash是动态语言中核心的数据结构。一旦你用过他们,你就会试图在此后接触的语言中寻找他们的身影或替代品。

Array、Map的对比

创建、迭代数组

ruby:

# ruby 创建Array很简洁,JS也一样
ary = [1,2,4,"a","b","c","Hello world!"] 

# ruby 用block iterate over array
ary.each{|e|puts e;}

php:

//php没有array literal,而是用一个array函数创建
$ary = array(1,2,4,"a","b","c","Hello world!");

//php使用foreach遍历数组或对象属性。
foreach($ary as $e){echo $e};

c++的std::for_each像是这二者的混合体。for_each施于一个序列容器,这一点像php。而for_each的最后一个参数却是一个functor或函数。这一点更像ruby的block。

创建Hash,增加键值

ruby:

# ruby用literal就可以初始化Hash
h = {"name"=>"az","gender"=>"male"}

# 增加一对 key,value
h["city"] = "beijing"

遍历:

h.each{|key,value| ... }

php:

// php的associative array类似ruby的Hash
$h = array("name"=>"az","gender"=>"male")

//增加key,value的语法和ruby一模一样
$h["city"] = "beijing"

遍历:

while(list($key,$value) = each($assoc_array)){
...
}

为对象增加属性

js:

// js 中的对象更像ruby的Hash
a = {}
a["city"] = "beijing"

php:

$a = new Klass();
$a->city = "beijing";

并行赋值和函数返回多个值

ruby:

a, b = 1, 2

def func()
1,2
end

a,b = func()

php:

list(a,b) = array(1,2)

function func(){
return array(1,2)
}

list(a,b) = func();

动态创建

js:

klass = "Date";
now = new eval(klass)();

php:

$klass = "Klass"
$k = new $klass();

类型鉴别

ruby:

obj.class
obj.ancestors

js:

typeof(obj)
php:
get_class($obj)
get_subclass_of($obj,"Klass")
get_parent_class($obj)

is_string($obj)
is_int($obj)
is_bool($obj)
is_object($obj)
is_array($obj)

PHP for C++ Programmer

在PHP的类方法中引用自身的函数或变量必须用$this $this->variableName

PHP类的默认访问控制是public,而不是private public $variable <=> var $variable

PHP的成员函数重载需要使用__call这个Magic函数。可以参见PHP手册。 也可以根据参数的类型来间接实现重载

function func($param){
    if(is_int($param)){
         ...
    }else if(is_string($param)){
         ...
    }else if(is_array($param)){
         ...
    }else if(is_object($param)){
         ...
    }
}

改变PHP类名的时候记得同步构造函数

lambda

Ruby中有block,使用非常频繁。 JS中有函数对象 PHP中有 string create_function ( string args, string code )

23:21 2010-4-2 更新: PHP5.3之后有了匿名函数

本文链接:http://aztack.wang/post/learn-php-again.html

-- EOF--

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。