本期格言:
当我们天资不够强大时,与其花500%的精力做一个单线程技术高手,不如花较少的精力做一个聪明的多线程程序员。
本期扯淡:
湖南卫视的“我是歌手”第一季终结,歌王产生。也许很多人心目中的歌王都不一样,但是不可否认的是,羽泉确确实实得到了“官方”宣布和“大家都认可”的歌王,我个人分析原因如下:
其实各个歌手实力都很强,各有特色,真没有歌王不歌王之分。如获得神给予天赋的林志炫、高音黄妈、全身都在摇滚的周晓鸥、细腻无比的杨宗纬以及其他各有特色的歌手。但是我个人认为只有羽泉是最聪明的歌手,论音色也许比不过林志炫、论感人也许比不过杨宗纬、论高音高不过妈、论摇滚得剃光头,所以羽泉采取的策略是把自己融入观众,而不是强迫观众融入他们的歌。最终在制胜局拿出最猛的杀手锏。
这里还要写一个经我加工过的神级分析:给羽泉投票时,喜欢“羽”有一票,喜欢“泉”有一票,喜欢邓超有一票,喜欢孙俪有一票,喜欢白百何有一票,支持3G天翼有一票,家里正在用立白洗衣液的有一票。因此羽泉的得票不第一,实在是天理难容了。何况立白和天翼还是本节目赞助商。
扯淡扯上程序员也一样:当我们猛然出道时发现Java高手前辈实在太多了,赤膊追赶也难以追上,毕竟人家的开发经验放在那;再发现c#,这厮版本和功能升级的也太快了,裸体跟着学也难以全部掌握成为牛人;再看看python或者ruby,学得好的人绝对是大牛而且是少数,学的不好的人基本上就是shit;因此我们不如学php,因为喜欢淘宝的有一票、喜欢mysql的有一票、喜欢apache的有一票、喜欢wordpress的有一票、喜欢dz论坛的有一票、喜欢centos的有一票,不多说了,羽泉是歌王,我们何不想办法成为程序员之王呢。
正文:魔力函数
为何叫魔力函数,或有的地方叫做魔幻函数。原因很简单,没有哪个语言能让你这么简单的把它从头到尾、从里到外如此方便和简单的完爆一遍。爆完之后,会让你有种把php 完完全全征服的感觉。这种感觉在java中是很难找到的,c#呢?oh,谈都不用谈吧。
(一)、 __construct 构造函数
构造函数的意思代表,它是第一个被爆的函数,不管你想不想爆,反正它会自动爆。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class
test
{
function
__construct
(
)
{
echo
'自爆第一次'
;
}
function
mydo
(
)
{
echo
'手动爆一次'
;
}
}
$newObj
=
new
test
(
)
;
$newObj
->
mydo
(
)
;
|
运行结果,是自爆第一次(不管你想不想),然后才会爆第二次。
这里有个知识点是:传参数也很简单,你可以__construct($arg1,$arg2);
同理也可以用 func_get_args这个函数来得到未知个数的参数。譬如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
test
{
function
__construct
(
)
{
$getargs
=
func_get_args
(
)
;
if
(
count
(
$getargs
)
<
2
)
exit
(
"参数必须有二个"
)
;
}
function
mydo
(
)
{
echo
"手动爆一次"
;
}
}
$newObj
=
new
test
(
"aaa"
)
;
//构造函数中$getargs[0] 的值就是aaa
$newObj
->
mydo
(
)
;
|
注意,用了exit,则mydo方法则不会运行,也就是你想手动爆是不可能的了。类似于c#的response.end。
这个构造函数的用法大部分被用在类继承上,也可以直接用在页面输出内容上,根据参数的个数来加载不同的内容。
(二)、__destruct() 析构函数
析构函数原则上的解释是:当删除一个对象或对象操作终止的时候,自动的调用该方法,所以可进行释放资源之类的操作。
实际上咱不要想太多,用了php,根本不需关注此函数。资源释放一切由zend负责,而且php也不适合在类里面做大数据量超级循环的事情,否则那真是自爆了。一般实际项目中,会通过继承的方式做一些日志的记录等小小的事情。如果有百万级数据要在你的类处理,要么说明你接到大项目你要发了,要么就是咱在做梦。
(三)、__autoload 自动加载
这个函数只有一个地方用得着。就是 自动加载函数文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class
水果
{
function
__construct
(
$用户的选择
)
{
if
(
$用户的选择
==
1
)
$苹果的对象
=
new
苹果
(
)
;
//这里会自动加载一个 啃苹果需要的函数.php
else
$榴莲
=
new
榴莲
(
)
;
//这里就不会加载 多余的php文件
}
}
class
榴莲
{
//太臭,但是我爱吃
}
class
苹果
{
//不臭,但是我不爱吃
function
__autoload
(
)
{
require
(
"啃苹果需要的函数.php"
)
;
}
}
$newObj
=
new
水果
(
1
)
;
|
上述列子请勿直接拷贝运行,搞成中文是为了更容易看懂。
(四)、__call
调用不存在的类的函数的时候得处理方法,__call 失败,就调用父类方法,依此类推。
这个函数个人认为是php最给力的函数。由此可以写出很亮的代码 譬如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class
data
{
function
__call
(
$name
,
$arguments
)
{
//$name代表方法名 $arguments代表参数
if
(
$name
==
"getSqlServer"
)
{
// 执行sqlserver相关的sql语句
}
else
{
//执行mysql相关的sql语句
}
}
}
$newObj
=
new
data
(
)
;
$newObj
->
getSqlServer
(
"select top 10 * from table1"
)
;
$newObj
->
getMysql
(
"select * from table1 limit 0,10"
)
;
//注意mysql是没有 top n的语法的
|
当然上面是一个列子,大家可以举一反三,在数据层,业务层都可以使用,尤其在构建一个虚拟实体或虚拟类时可以实现可配置化很高的代码写法。
(五)、__get 、__set
当属性未定义时,get或者set时,会自动调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
data
{
function
__get
(
$name
)
//$name 代表属性名
{
if
(
$name
==
"H7N9"
)
//变量为H7N9没有定义它,则调用__get,定义了,则不会进入
return
"禽流感"
;
else
return
"不要扯淡"
;
}
}
$newObj
=
new
data
(
)
;
echo
$newObj
->
H7N9
;
echo
$newObj
->
H100N30
;
|
用这个办法,依然可以写出很亮的代码
(六)、__clone()
当对象被克隆时,执行的函数
1
2
3
4
5
6
7
8
9
10
11
12
|
class
data
{
var
$myname
=
"shenyisyn"
;
function
__clone
(
)
{
$this
->
myname
=
"假的shenyisyn"
;
}
}
$newObj
=
new
data
(
)
;
echo
$newObj
->
myname
;
$obj2
=
clone
$newObj
;
echo
$obj2
->
myname
;
|
这个函数实际项目中也有,譬如做新闻网站,某个新闻的类叫做news, 用户可能会复制一条同样的新闻进行采集,此时我们可以在__clone()函数中,对某些标识值进行处理。如
1
2
3
4
5
6
7
8
9
10
|
class
news
{
var
$newsid
=
1
;
function
__clone
(
)
{
//在数据库中执行 ID为1的新闻,让其被引用或者采集字段加+1
}
}
$newObj
=
new
news
(
)
;
$news2
=
clone
$newObj
;
//终于有外站用户来采集我站新闻了,我好欢喜
|
(七)、__toString()
用法看例子直接明了
1
2
3
4
5
6
7
8
9
10
|
class
news
{
var
$newstitle
=
"美国国务卿克里抵京访华"
;
function
__toString
(
)
//不加这个函数,则会出现 对象无法按字符串输出
{
return
"这是一个新闻对象,我只能给你一个标题"
;
}
}
$newObj
=
new
news
(
)
;
echo
$newObj
;
//额。。手误了,忘记这货不是一个字符串,不过照样可以爆出来
|
(八)、__sleep __wakeup
这个函数只在类被序列化或者反序列化时自动调用。看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class
news
{
var
$user1
=
"卞工"
;
var
$user2
=
"猪刚烈"
;
var
$user3
=
"学姐"
;
function
__sleep
(
)
{
echo
"学姐是保密的,不会让你序列化"
;
return
array
(
"user1"
,
"user2"
)
;
//user1和user2 必须和上面定义的变量名是一致的。
}
}
$newObj
=
new
news
(
)
;
$obj
=
serialize
(
$newObj
)
;
var_dump
(
$obj
)
;
|
以上为魔幻函数,实际上这是php最亮的部分没有之一。
要在后期实际项目中写出很man的程序必须首先了解这些魔幻函数。
譬如我们在java或者.net中做数据层时,需要建立实体类,数据库稍微一更改就要修改类文件。而在php中就没必要这么麻烦。可以这样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class
news
{
var
$newsfield
=
array
(
)
;
//$newsfield代表数据库字段集合
function
_get
(
$name
)
{
if
(
array_key_exists
(
$name
,
$this
->
$newsfield
)
)
return
$this
->
$newsfield
[
$name
]
;
else
return
""
;
}
function
_set
(
$name
,
$value
)
{
$this
->
newsfield
[
$name
]
=
$value
;
}
}
|
当然,这只是一个列子。正式使用php开发实际项目,是不建议使用这种 hibernate的实体类思想。
在设计实际业务类的基类时,用魔幻函数更有有用。
转自:程序员在囧途