PHP,这货让一堆程序猿爱恨交加,可它还是在网页开发圈里混得风生水起。有人说它OUT了,可我这种老油条得说,PHP的精髓不是语法多帅,而是能让你最快速度从新手变废柴。今天个,我就跟你们聊聊PHP的“精华”,顺便带你们瞧瞧我最近搞的一个项目,看看我是怎么把一个简单功能搞成超级大工程的。
PHP的精粹:变量和数组
PHP里有个绝活儿,就是那变量和数组。变量前面得有个$符号,这设计,让人又觉得它挺有个性,又觉得它有点烦人。个性是它能让代码显得特别清楚,烦人是因为你老搞不清这变量是从哪儿蹦出来的。就像下面这段代码:
$name = "John";
$age = 25;
这货儿是个数组,里面装着名字和岁数,格式就是这德行:名字是啥,岁数是几。
这事看着挺简单?可要是你一不小心把名字变量写错了,PHP那家伙可不会给你闹脾气,它就那么默默地给你来个空空如也。然后你搞了半天,才发现是名字写错了,这时候你是不是觉得自己有点二?
数组的“精粹”
PHP的数组那可是个宝,既能当清单使,又能做字典用。比如说:
这货里头装着苹果、香蕉、樱桃,就这仨东西。
水果价格表如下:苹果1.2元,香蕉0.8元,樱桃2.5元。这价格,苹果贵得有点意思,香蕉便宜得让人心动,樱桃那简直是奢侈!
看起来挺风光,可PHP里的数组有点不靠谱,它那键儿既可以是字符串,也能是数字。要是不小心搞错了,比如:
这货搞了个数组,里头"1"对应个"apple",而数字"1"又对应了个"banana"。这俩"1"搞混了,真是个笑话。
这时候,$mixedArray就变成了array(1 => "banana"),PHP这货居然把字符串"1"和整数1当成了同一条道上的兄弟。这隐秘的变身术,真是让人哭笑不得。
函数的“精粹”
PHP那函数写法,真是让人又爱又恨。函数名大小写不敏感,比如strlen和STRLEN其实是一码事。这设计得挺逗的。你永远猜不透同事会用啥风格命名函数。调试时,你发现调用没问题,可结果不对,最后才发现是大小写搞的鬼。
这事还得多说两句,PHP里的函数参数排法简直是个大坑。就拿strpos()来说,你得先写$haystack,再写$needle,这顺序跟in_array()反着来,让人看了直想骂娘。这设计,真是让人头都大了。
面向对象的“精粹”
PHP这东西,搞对象设计时,心里那叫一个纠结。类和方法的设计,还算中规中矩,可那魔术方法,简直让人又爱又恨。你说像那个__construct()啊、__destruct()啊、__get()啊、__set(),看起来挺高大上的,但要是用错了,调试过程那叫一个折磨人,简直想抓狂到把键盘砸了。
举个例子:
class User {
private $name;
这东西叫构造函数,一出生就得有个名字参数。
$this->name = $name;
这东西叫啥来着?得了,反正就是弄个啥东西,你叫它啥都行,反正就是得手一招,直接给你整出来。
if ($property == "name") {
return $this->name;
}
}
$user = new User("John");
echo $user->name;
这看起来挺顺眼?结果你一不小心把get()给写成_get()了,PHP那货愣是没给你报错,直接给你来个空空如也。你瞎忙活半天,最后才发现是方法名搞错了,这时候你是不是觉得自己智商有点感人?
错误处理的“精粹”
PHP那破错误处理系统,让人又爱又恨。它那错误报告等级多得跟啥似的,比如E_ERROR、E_WARNING、E_NOTICE啥的。你要是不小心把那错误报告等级调得太低,比如:
这代码搞的,啥提示都不显示,就只给我报了个错。
这时候,PHP悄无声息地忽略了所有那些NOTICE级别的错误。你调试了大半天,结果发现是变量没搞明白或者数组里的那个键根本没影儿。这时候,你心里肯定在骂自己,感觉自己像个白痴。
数据库操作的“精粹”
PHP跟数据库打交道,这感觉就像爱恨交加。那个mysql扩展,早就不流行了,现在咱们得用mysqli或者PDO。可这俩东西的设计,也是让人又爱又恨。比如说mysqli,它那面向对象和过程式风格混搭,简直让人头大。
这货连接数据库,本地地址,用户名,密码,数据库名,一套操作溜得飞起。
if ($mysqli->connect_error) {
哎呀妈这连接搞不定,直接来个狗带操作:“Connection failed: ”,然后把这$mysqli->connect_error给扔了。
$sql = "SELECT * FROM users";
这货执行了那啥SQL语句,结果直接就出来了。
if ($result->num_rows > 0) {
当每行数据被这条命令抓取过来的时候,{ }
兄弟,看这货,ID是啥的来着?$row["id"],名字?$row["name"],邮箱是啥的?$row["email"],还带换行的,真是够意思。
}
} else {
echo "0 results";
这看起来挺顺眼?结果你一不小心把$mysqli->query($sql)搞成了$mysqli->query($sql, MYSQLI_USE_RESULT),PHP竟然不闹腾,悄无声息地给你个空空如也的结果集。你一头雾水调试了老半天,最后发现是参数搞错了,这时你肯定觉得自己智商不够用,像个愣头青。
文件操作的“精粹”
PHP这东西对文件的操作,让人又爱又恨。它那读写文件的函数种类繁多,像是fopen啊、fread啊、fwrite啊、fclose啊之类的。可要是你一不小心搞错了文件模式,那可就尴尬了。
这货打开了个叫“test.txt”的文件,读模式来着。
fwrite($file, "Hello World");
fclose($file);
这时候,PHP这货愣是没给点错,它就那么默默地把fwrite()给无视了。你捣鼓了老半天,最后发现是文件模式搞错了,这时候你心里肯定在骂自己,感觉自己像个白痴。
项目实战:一个简单的用户管理系统
话说这么多,咱们来点干货。这不,最近我整了个小东西,一个用户管理系统,纯PHP加MySQL搞定的。功能,就那么几个,注册个号,登录一下,瞅瞅个人资料,简单不简单?你说简单,那可就错了,用PHP搞这事,简直让人又爱又恨,哭笑不得。
数据库设计
我们设计一个简单的用户表:
CREATE TABLE users (
这货是个ID,整数类型,自增长,关键得是主键。
这东西用户名长度得有50个字符,一个都不能少。
密码这东西,长度得有255个字符,一个都不能少。
);
这事听着挺容易?可你要是没注意把密码那栏的长度设置得短了,比如说只给VARCHAR(50)那么点空间,用户注册时要是输入了个超长密码,PHP可不会给你报错,它就那么悄无声息地给截了。等用户登录时发现密码不对劲,这时候你都得怀疑自己是不是脑袋进水了。
用户注册
我们实现用户注册功能。首先,我们写一个简单的HTML表单:
这货就是个注册表单,动作指向注册页面,提交方式是POST。
用户名输入框:<输入你的用户名,格式如下:<input type="text" name="username">,记得填!<br>
密码框:<输入密码区域,名字叫password><br>这东西得填对,别搞错了,不然就悲剧了。
这货是个注册按钮,点它就能加入我们。
</form>
我们写register.php来处理表单提交:
这货儿提交的用户名,直接就抓过来存了。
这密码,得先经过一道特殊处理,就相当于给它来个加密,保证安全。咱们把用户填的那密码,经过这么一操作,就能生成一个加密后的版本。
$email = $_POST['email'];
这代码块儿,往用户表里头塞数据,用户名、密码、邮箱,一个都不能少,直接往里头填,就这么简单。
这东西一运行,要真给整对了,那可就美了。
搞了个新记录,弄好了,没毛病。
哎呀妈这代码里头出了点岔子,瞧瞧这SQL语句,还跟个错别字似的,跟它来个亲密接触,这数据库还来个“哎呀我去”,直接把错误信息给甩出来了。
这看起来挺美?可要是你傻乎乎地把$username直接往SQL里一扔,啥过滤都没做,结果有人用' OR '1'='1'这招来玩儿,你的数据库就等着被黑。然后你费老鼻子劲调试,最后发现是SQL注入这茬儿,这时候你是不是觉得自己像个白痴?
用户登录
咱们搞定了用户登录那一套。<搞个表单,动作指向login.php,提交方式是post。>
这货是个登录按钮,点它就能进。
我们写login.php来处理表单提交:
这密码,直接从表单里抓了个现成的。
这东西就是从用户表里头,把那些名字跟输入的这东西对上的,全都捞出来。
这东西从那结果里掏出来一行数据,就那么简单。
密码校验成功,$password跟数据库里的密码对上了号。
echo "Login successful";
} else {
echo "Invalid password";
echo "User not found";
看起来很美对?
总结
PHP这东西,简直就是个“速成”神器,让你分分钟体验从新手到想放弃的全过程。变量、数组、函数、面向对象,还有那让人头大的错误处理和数据库操作,简直让人哭笑不得。