深入理解php高级技巧
① 如何学好php
1.首先,理解网站这一概念之后不难看出,任何网站都是由网页组成的,也就是说想完成网站,必须先学会做网页,因此必须要掌握了HTML,才能为今后制作网站打下基础。
在学习HTML中我想边学边做是最有效的方式,当然这一方式对于学习PHP同样是最有效的。HTML中的任何元素都要亲自实践,只有明白了什么元素会起到什么效果之后,你才会记忆深刻,而一味的啃书,绝对是不行的,我想大部分新手之所以觉得概念难学,大部分是一个字“懒”,懒是阻止进步的最大敌人,所以克服掉懒的习惯,才能更快的学好一样东西。
也许您在学习PHP的时候只想尽快的开发一个网站,也就会想我做网站,干嘛要学什么网页这些小儿科?不难看出,眼高手低的新手不在少数,这种思想无疑于建造空中楼阁,你不建地基,何来的房顶呢?
OK,掌握静态网页的制作技术是学习开发网站的先决条件,这一点就讲到这里,因为这篇文章不是教程文章,也就不对技术进行深入的刨析了。
我假设你目前已经可以完成一个静态页面了,当然,做的好看难看是另外一说,默默的第一个网页也没好看到哪去,但是“孩子”再丑,咱们做“爹妈”的也不能嫌弃不是?这毕竟是咱的成果。那么咱们就开始学习动态语言的概念吧,刚一接触动态语言,可能很多人都会蒙了,怎么这乱七八糟的东西,在网页里显示的时候却是另外一码事?其实这并不算乱七八糟,你写的HTML代码不也一样是一堆堆的字符吗?毕竟,代码并不是作为直接输出的,而是经过处理的,说白了,HTML是经过HTML解析器,而PHP当然也就通过PHP解析器了,跟学习HTML一样的道理,想让任何的解析器完成操作,就必须使用它们专用的语法结构,所以PHP长相奇怪也就不足为奇了。
对于PHP的理解是新手最难迈过的一道门槛,不过你应该感到幸运的是PHP已经最大极限的为了新手而努力了,如果你学过其他的语言,也许会觉得PHP的确相当的简单,但是如果你之前什么都没学过,那么阿弥陀佛,硬着头皮琢磨吧。
书过三遍自然熟,这个简单的道理告诉我们,即使你理解不了PHP,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。
在一段挣扎之后,聪明的你,显然已经逐渐的开悟了,慢慢的理解了编程的概念,那么祝贺你,你已经迈出了成功的第一步。
2.搞清楚HTML和PHP的概念,那么PHP和HTML混合编程应该不成问题,在这期间,你完全可以让PHP给你算算 一加一等于几,然后在浏览器输出,不要觉得幼稚,这的确是跟阿波罗登月一样,你打的是一小段代码,但是对于你的编程之路,可是迈出了一大步啊!兴奋吧?但是不得不再给你泼点冷水,您还是菜鸟一个。
高兴一段时间就必须继续努力了,接下来就是学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。
头晕归头晕,目眩归目眩,你不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。
在一番搏斗之后,你终于理解了数据库的概念,而且让你兴奋不已的是你终于可以通过PHP来连接数据库了,这期间你是怎么学会的,我们不去考证了,但是事实证明,你已经可以了。 学会了PHP和数据库的你,无疑是左手拿着MOTOLOLA右手拿着NOKIA,要多潇洒,有多潇洒,哈哈,终于学会了,但是可能这个时候,又会有人不经意的拍拍肩膀对你说:哥们,别高兴的太早,你还是菜鸟,离学会还差着一大截呢!
等到你发奋努力的学会了用PHP成功的插入,删除,更新数据的时候,显然,你已经距离成功指日可待了。
这个时候的你也许是这种状态: 你会HTML吗?会,我能编好几个大表格排板的网页啦! 你会PHP吗?会,我会把一加一的运算写在函数里,然后调用啦! 你会MYSQL吗?会,我会把我的信息在数据库里插入删除啦。那,接下来你该怎么做呢?我觉得,小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和HELLO WORLD有一比啊!^_^,同是新手面临的第一道关。
3.花了一段时间,你终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。但是,你可能瞅瞅东,看看西,人家这个编论坛,那个CMS,还有那啥CRM,我啥时候写一个呢?不要急,可以说你的马步已经扎的差不多了,接下来就要开始练把势的时候了,如果有条件的话,用笔或者打印一个简易的PHP手册在身上,时不时的摸出来看看,记得,去WC也不能放过(^2^)。再有条件的话,买本书看看吧,《PHP+MYSQL WEB开发(第三版)》号称圣经级,(也许是个不错的选择(声明:作者没给我啥好处费,我也不是书托,隔着大老远,我连他老兄的面都没见过的说-_-)
巩固了自己的知识,熟悉了PHP和MYSQL开发的要领之后,再回头看你写的那个留言本,你也许会怀疑那真的是你写的吗?当然,如果屋里还有鬼的话,也许是它写的-_- 这个时候,你的留言本应该加入注册以及分页功能了,而如果你更强的话,UI(用户界面)也可以加强,完成之后,感觉是不是特有成就感?不管怎么样,咱好歹是写了一个动态网站程序了,放在自己的网站上耍耍吧,让好朋友来看看,嘿,看咱写的多棒,然后再在网上宣传一下。几天之后你再打开留言本,哎?哇,一下弹出N多页面!很明显,你的留言本并没有做好安全防范,被人用JS代码小小的耍了一下,我很同情你这个时候的感受,但是没有别的办法了,继续努力吧!
你发奋努力,熟悉了安全方面的问题,然后又设计了一些程序,感觉还不错。那么接下来,这就算学会啦?NO,NO,NO,还早呢,你至尽还没碰过OOP之类的吧?模板呢?恩,学!加紧学呀学,学会了这些之后,你又学会了生成静态网页,现在你应该接触一下XML了,恩,XML也了解了,那么AJAX你也得接触接触吧?AJAX完了....然后...
总而言之,你绝对不会发现你全部都学会了,一些真正的强人总会搞出新玩意来丢给你,你不学就落后了,也印证了前人的经验,果然是学无止境啊!我想通过我的一番YY,你也应该大致熟悉了一些学习过程,也许我的过程和你的有些出路,但是不管怎么样是殊途同归,我写这么多,也只是给大家一个借鉴的机会,至于好与不好,默默不敢打包票^0^ 看完之后你发现,罗嗦这么多,对我一点用处没有啊,我知道该怎么学,但是我想如何才能更快的学,一周速成,啊不,24小时速成那种,默默你有没?我.......我没有,但是2分钟之内把你扁进医院里,我倒是有把握-_-
4.学东西,永远不要妄想有速成这一说,告诉你了一个方式,但是缺少努力这一环节,那也是白搭。但是有一点我可以给你保证的就是,你学会了PHP,那么学其他的语言,肯定速成,反过来也一样,如果你之前学过其他的语言,那么学PHP肯定快。
不过语法好学,但是怎么用语法来实现每个人都有每个人的方式,几乎是各有千秋。然而借鉴别人成功的代码,绝对是有益无害,因此,多看那些经过千锤百炼凝出来的经典代码,是进阶的最好方法。
讲了这么多,无非是想说:学习PHP不仅要掌握方法,更多的是付出汗水,我不希望看到中途放弃的人,相信自己,相信自己的选择,更要相信自己的能力,如果自己想放弃,暴力一点的话,就自己抽自己一个嘴巴,然后大吼:别人可以,我为什么就不可以?(是不是有点阎罗教练的味道,默默的确是电影看多了,抽嘴巴是会痛的,各位其实明白这个道理了就行了)
② 怎样深入学习php,成为php高手
PHP相对于其他语言,比较简单,相对好上手,比较适合零基础的人学习。我就算是零基础学习PHP的,大学上的是影视制作,在大学期间对编程感兴趣,然后看的黑马程序员的PHP入门教程,在大四最后的半年时间里,我去培训了PHP,出来找了一份工作,现在已经是一名PHP开发工程师了,想要深入学习,还是要有老师教的,不然自己很容易进入误区,好多东西都不会的。
③ 求深入理解PHP:高级技巧、面向对象与核心技术(原书第3版)pdf版
没有扫描版的,我也招了很久了,上次下了都是简略版,就几十页,自己花个几十块钱买本书吧
④ 深入PHP中的HashTable结构详解
深入PHP中的HashTable结构详解
深入PHP中的HashTable结构详解
对php内核有一定了解的人应该都知道php的精髓就是HashTable,HashTable在php的实现中无处不在。包括php的数组、什么全局变量、局部变量的作用域等等,php的hashtable拆开来说就是四部分:
hash函数:用的是time33的散列函数,将一个字符串的key转换成一个数字
一个C数组:用来储存桶(buckets)的
两个双向的链表:第一个双向链表是数组的每个元素(桶bucket)是一个双向链表,这样做是为了解决hash冲突;第二个双向链表是数组将每一个桶(bucket)连接起来,这里要连接的也就是第一个双向链表的链表头,这样做是为了遍历整个hash表用的,鸟哥有篇blog是讲php的foreach的,这里这样设计就是给foreach用的==>《深入理解PHP之数组(遍历顺序)》
我这里不再说hashtable的struct和bucket的`struct了,因为下面的推荐链接几乎都讲了,我不觉得我能描述和说的比他们好,每个人的水平不一样,我就以我现在的技术水平来描述,所以我就只把我整理的一些东西记录一下
下面是php中hash实现的两个文件:zend_hash.c zend_hash.h。这两个文件里面实现了一堆的api,也引申出了一堆的api,下面是实现出来的api的原型
复制代码 代码如下:
ZEND_API ulong zend_hash_func(const char *arKey, uint nKeyLength)
ZEND_API ulong zend_get_hash_value(const char *arKey, uint nKeyLength)
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
ZEND_API void zend_hash_set_apply_protection(HashTable *ht, zend_bool bApplyProtection)
ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_quick_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_index_update_or_next_(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int zend_hash_rehash(HashTable *ht)
static int zend_hash_do_resize(HashTable *ht)
ZEND_API int zend_hash_del_key_or_index(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, int flag)
ZEND_API void zend_hash_destroy(HashTable *ht)
ZEND_API void zend_hash_clean(HashTable *ht)
static Bucket *zend_hash_apply_r(HashTable *ht, Bucket *p)
ZEND_API void zend_hash_graceful_destroy(HashTable *ht)
ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht)
ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument TSRMLS_DC)
ZEND_API void zend_hash_apply_with_arguments(HashTable *ht TSRMLS_DC, apply_func_args_t apply_func, int num_args, …)
ZEND_API void zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, void *tmp, uint size)
ZEND_API void _zend_hash_merge(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, void *tmp, uint size, int overwrite ZEND_FILE_LINE_DC)
static zend_bool zend_hash_replace_checker_wrapper(HashTable *target, void *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)
ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, uint size, merge_checker_func_t pMergeSource, void *pParam)
ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData)
ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void **pData)
ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, uint nKeyLength)
ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h)
ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData)
ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h)
ZEND_API int zend_hash_num_elements(const HashTable *ht)
ZEND_API int zend_hash_get_pointer(const HashTable *ht, HashPointer *ptr)
ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr)
ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_ex(const HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool plicate, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_data_ex(HashTable *ht, void **pData, HashPosition *pos)
ZEND_API int zend_hash_update_current_key_ex(HashTable *ht, int key_type, const char *str_index, uint str_length, ulong num_index, int mode, HashPosition *pos)
ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func, compare_func_t compar, int renumber TSRMLS_DC)
ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC)
ZEND_API int zend_hash_minmax(const HashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC)
ZEND_API ulong zend_hash_next_free_element(const HashTable *ht)
void zend_hash_display_pListTail(const HashTable *ht)
void zend_hash_display(const HashTable *ht)
;⑤ 如何最快速的学习PHP
作为一个PHP程序员来说,并不是告别了大学校园你的学习生涯就此结束,而是刚刚开始!!你绝对想不到你将要面对的知识海洋是浩瀚无边的,你学习的速度永远赶不上它更新的速度。甚至你都还没有掌握透某个技术,新的技术又已经迭代进来。而最重要的是,你不得不强迫自己,在更新迭代的浪潮中脱颖而出,适应工作提升自己。那么,我们又应该怎么按自身的情况提升自己呢?我将从实习、初级、中级三个阶段进行讲解。
一、实习阶段的PHP程序员提升方法
刚出大学出来的程序员,学习能力是最强的,这时候最有朝气和想法。但是初入职场都会感觉一切很新颖,随着上班久了就会有倦态感,慢慢的就会出现那种朝气没有了,上班一天回到家只想躺在床上玩手机。久而久之,非常不利于自己的成长。一旦养成这种习惯,后期想再重新拾起是一件很困难的事情。那么作为一个过来人,我建议你可以这样做:
1、初入职场,多学多看多记
刚进入职场的PHP程序员一定会很爱吐槽,我拿这么少的工资做那么多的工作。如果你在抱怨,那对你提升是有很大的影响。你可以混这份工作混完3个月,你也可以3个月时间把你自己糊弄过去。
作为一个刚进入到企业中的实习生,钱真的不是最重要的,能力的提升才是无限增值的。你不会希望实习完就完了吧?然后再毕业找一份更好的?那么你的职场经历凭什么靠这3个月的实习来让我给你超过实习时候的工资?很多时候你的工作经历,企业是不看重实习期工作经历的。为什么?因为实习期就是一个给初入职场的大学生适应学习编程的阶段而已,并不会安排很重要的工作给你。所以你实习期间的工作经历,在别的公司里面普遍认为没有价值,记住是没有价值!!为什么这么说?因为那个期间企业在花钱给你进来学习(适应职场),接触的东西都不会是最重要的模块(我想你也应该有体会,熟悉系统,修改bug,开发小功能)。而你毕业之后重新进一个企业工作时,你就会发现你做的东西更重要(涉及服务器维护、接口开发、数据库设计)更加的深入。
初入职场的实习生是最宝贵的,别以为企业花钱是让你打杂的。如果你真认为自己进来就是打杂的,那你的心态不正做事也不正就更别想说从中学点什么了。
做的事情简单,但是请你一定要去思考怎么把它做的更好,其他相关的模块是如何和你做的挂钩的(思维发散)?你做的这个模块会影响哪些功能(全局观)?我的建议就是从点到面,做完了就积极的跟导师(组长)要任务,你做的越多你的能力提升的越快。个人建议,刚出来时不要贪快,要的是好!即使慢都不要紧。
这时候,最重要的是养成一个习惯:思考!!思考我从这里学到了什么,这些东西对我有什么帮助。如果我下次在遇到这个问题怎么样可以快速解决?在后面的工作中你一定会发现效率怎么一下子就上来了。
首先,一定要多学,看周围同事或导师,他们的代码怎么编写的。
其次,一定要多看,多去看周围同事是如何为人处世工作的(态度),这些对你后面处理工作人际关系很有帮助(职场晋升这块)。
最后,一定要多记,没人什么东西都记得全!!多记,忘记了还可以回过头来翻看看,回忆一番,对你帮助绝对大!!
2、工作中多总结
我的建议就是,每周工作都要写周报!!如果可以最好每天都写日报。这一块东西千万别小看,你从这些日报和周报中发现自己的成长。其次记录了你的处理问题,当你再回过头去看的时候,你会发现原来自己做了这么多事情,后面对你写简历,跟面试官交流这些东西的时候,面试官都会觉得你心细,是个不错的培养对象。
3、闲暇时间多看技术博文、相关技术发展方向
提升最快的办法就是站在别人的肩膀上看远方!并不用你花很大块的时间研究这些,你只需要自己业余时间(等车、车上)刷下手机看看这类博文,然后收藏(收藏并不等于就没用了,而是为了当你工作中遇到这些问题时可以快速找到这些文章帮助你)。业余时间的积累是你提升最快的,并不需要你花什么大的心思,还是一个很不错的习惯。在浏览博文过程中,建议多评论(和作者交流做朋友),互相交流思想会让你的编程思维上一个水平。
4、定目标,找准方向提升
编程的世界发展很快,初入职场的PHP程序员请一定要找准方向。往一个方向精通下去。因为学的东西实在太多。千万不要这学一点(例如PHP开发),那学一点(前端开发),对你应付深入的PHP开发问题时你一定会崩溃!!你好像什么都懂,但是不深入胜任不了难的工作,其次你的效率也不高,在试用期企业就能看出你的水平,这时候你也会感觉很艰难。
所以想好自己往哪个方向走,就专精那块。有经历再发散分支一起学。
⑥ 深入理解PHP 数组之count 函数
count()
PHP
count()
函数用于计算数组中的单元数目或对象中的属性个数,返回数组的单元个数或对象中的属性个数。
语法:
int
count(
mixed
var
[,
int
mode]
)如果
var
是非数组的普通变量,则返回
1
,对于不存在、未初始化或空数组返回
0
。
可选参数
mode
设为
COUNT_RECURSIVE(或
1),count()
将递归地对数组计数,这对计算多维数组的所有单元尤其有用,但
count()
识别不了无限递归。mode
的默认值是
0
。
例子:
<?php
echo
count($x);
//输出:0
$a
=
2;
echo
count($a);
//
输出:1
$arr_age
=
array(18,
20,
25);
echo
count($arr_age);
//
输出:3
?>
sizeof()
是本函数的别名。
在实际应用中,经常会根据数组的大小来进行一些循环操作,建议将
count()
写在循环体外:
<?php
$arr_age
=
array(18,
20,
25);
$count
=
count($arr_age);
for($i=1;$i<=$count;$i++){
echo
"第
$i
次循环";
}
?>
这样不必每次循环都去执行
count()
计算,当然这不是必须的。
以上这篇深入理解PHP
数组之count
函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。