周末梳理了下这段时间看书的一些 知识 点,进步的过程不仅要实践,还要安排多看书、思考、 总结 。 只针对 知识 点进行了罗列和简单说明,很多细节还未整理好,待后面再专门详细写。 基础易忽略概念 PHP是一个支持面向对象开发的语言,而不是一个纯面向对象
周末梳理了下这段时间看书的一些知识点,进步的过程不仅要实践,还要安排多看书、思考、总结。
只针对知识点进行了罗列和简单说明,很多细节还未整理好,待后面再专门详细写。
基础易忽略概念
PHP是一个支持面向对象开发的语言,而不是一个纯面向对象的语言
PHP5中保留了对var的支持,但会将var自动转换为public
类型检查函数:
<span>is_bool</span><span>() </span><span>is_integer</span><span>() </span><span>is_double</span><span>() </span><span>is_string</span><span>() </span><span>is_object</span><span>() </span><span>is_array</span><span>() </span><span>is_resource</span><span>() </span><span>is_null</span>()
PHP魔术方法:
<span>__call() __callStatic() (必须是static属性) __set() __get() __isset() __clone() __toString()</span>
字符串"false"在比较操作时会解析为true,因为PHP在测试变量时会转换一个非空字符串值为bool值true
静态方法是以类作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性(不能在静态方法中使用伪变量$this)
常量属性只包含基本数据类型的值,不能将一个对象指派给常量
抽象类(abstract class)不能被直接实例化,只定义(或部分实现)子类需要的方法
抽象类至少包含一个抽象方法
static类似于self,但它指的是被调用的类而不是包含类
return new static()
复制对象(设计模式中的原型模式):
<span>$first</span> = <span>new</span><span> ClassName(); </span><span>$second</span> = <span>$first</span><span>; </span><span>//</span><span>在php5以后的版本中,$second 和 $fitst指向同一个对象</span> <span>$third</span> = <span>clone</span> <span>$first</span>; <span>//</span><span>使用clone进行"值复制" //在php5以后的版本中,$third和$first是两个不同的对象</span> <span>/*</span><span>控制复制什么: 可以实现一个__clone()方法 比如待复制的对象中有个$id=1,可我们希望此id唯一,不希望clone此id,可以在类中自己实现clone方法</span><span>*/</span>
回调、匿名函数:
<span>is_callable</span><span>(); </span><span>call_user_func</span>(<span>$funcName</span>,<span>$param</span>); <span>//</span><span>单个参数</span> <span>call_user_func_array</span>(<span>$funcName</span>,<span>$arrParam</span>); <span>//</span><span>参数是数组的形式</span>
命名空间Namespace:
命名空间是一个容器,在命名空间之外,必须导入或引用命名空间才能访问它所包含的项。
<span>namespace com\name\test1; </span><span>class</span><span> Debug{ </span><span>static</span> <span>function</span><span> test(); }</span>
<span>namespace test2; </span><span>//</span><span>调用test1命名空间中的test方法</span> \com\name\test1\Debug::test(); <span>//</span><span>最前面必须加上 / 否则会在test2下寻找此命名空间</span> <span>use</span><span> com\name\test1; test1\Debug</span>::test();
解决类命名冲突:
<span>use</span> com\name\test1\Debug <span>as</span><span> uDebug; </span><span>class</span> Debug{...<span>} uDebug</span>::<span>test(); __NAMESPACE__ </span><span>//</span><span>输出当前的命名空间</span>
命名空间加大括号形式:
<span>namespace com\name\test1{ </span><span>class</span> Debug1{...<span>} </span><span>class</span> Debug2{...<span>} }</span>
require()调用文件发生错误时,将会停止整个程序,
调用include()时遇到相同的错误,会生成警告并停止执行包含文件,跳出调用代码然后继续执行。
require()和require_once()用于包含库文件时更加安全,include()和include_once()适用于加载模板等操作
相对require()函数,require_once()需要额外的开销
自动加载autoload:
当PHP引擎遇到试图实例化未知类的操作时,会调用__autoload()方法(需提前定义),并将类名当作字符串参数传递
例如:
<span>function</span> __autoload(<span>$className</span><span>){ </span><span>//</span><span>将$className中的下划线转换为目录分割</span> <span>$path</span> = <span>str_replace</span>('_',DIRECTORY_SEPARATOR,<span>$className</span><span>); </span><span>require_once</span>("<span>$path</span>.php"<span>); }</span>
__autoload方法是一种根据类和文件的结构,管理类库文件包含的有效方法。
类函数:
<span>class_exists</span><span>(); </span><span>get_declared_classes</span>(); <span>//</span><span>获得脚本进程中定义的所有类的数组</span> <span>get_class</span>(<span>$obj</span>); <span>//</span><span>检查对象的类,检查对象所属的类</span> <span>$obj</span> instalceof className; <span>//</span><span>检查对象</span> <span>get_class_methods</span>(); <span>//</span><span>获取一个类中所有的方法列表</span> <span>is_callable</span>()、<span>method_exists</span>() <span>//</span><span>检查类方法是否存在且可被调用</span><span> #</span><span>一个方法存在并不以为着可调用,对private、protected、public方法,method_exists()都返回true</span> <span>get_class_vars</span>(<span>$className</span>); <span>//</span><span>获取类中定义的属性</span> <span>get_parent_class</span>(<span>$classNa</span>,e); <span>//</span><span>获取一个类的父类</span> <span>is_subclass_of</span>(<span>$className</span> , 'classStrName'); <span>//</span><span>检查类是否是另一个类的派生类</span> <span>class_implements</span>(<span>$className</span>); <span>//</span><span>返回一个由接口名组成的数组</span>
反射API
根据到达地找到出发地和来源,反射指在PHP运行状态中扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API
使用反射API可以对文件里的类进行扫描,逐个生成描述文件
面向对象设计的五大原则:
sql优化的10个原则:
缓存的三个要素:
通常缓存更新策略有:
MySQL 的 Query Cache使用的是FIFO策略
缓存的最大数据量是在缓存中能够处理元素的最大数或所能使用的最大存储空间
超过缓存机制允许的最大数据量系统会进行相应的处理,一般处理方式有:
Opcode缓存:
虚拟机把PHP代码编译成一种中间码的结果缓存起来,下次PHP运行此页面时,只要直接解释这些代码就行了。
eAccelerator工具能起到常驻内存的作用
客户端缓存、http缓存(待记录)
H5中的Application Cache:
用来处理离线应用中的问题,用户不能联网时依然能浏览整个站点
需要在html中指定页面是否需要此缓存:
Memcached
使用Memcached:
Memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数。
Memcached特点:
Memcached把数据存储在内存中,所以重启Memcached或者操作系统会导致数据全部消失
安装memcached:
apt-get install memcached
启动memcached:
memcached -d -m 128 -u root -p 11211
-d:守护进程方式运行
-m:设置Memcached可使用的内存大小,单位是MB
-l:设置监听的IP地址,本机可默认不设置
-u:指定用户
-p:设置监听的端口,默认为11211
安装PHP的memcached扩展:
sudo apt-get install php5-memcache
memcached扩展的一些方法:
$timeout为连接持续时间,默认为1秒。过长的时间会倒置失去所有缓存的优势
Memcached使用多路复用I/O模型(如epoll、select),传统阻塞IO中 系统可能会因为某个用户连接还没做好IO准备而一直等待,直到这个连接做好准备,如果此时游其他用户连接到服务器,可能会因为系统阻塞而得不到相应。
多路复用I/O是一种消息通知模式,用户连接做好IO准备后,系统会通知这个连接可进行IO操作,这样就不会阻塞在某个用户连接。
Memcached使用Slab分配算法保存数据
Slab分配算法的原理是,把固定大小(mem默认为1M)的内存划分为n块,每1M大小的内存块称为一个slab页,每次向系统申请一个slab页,然后通过分割算法把这个slab页分成若个小块的chunk,然后把这些chunk分配给用户使用。
Memcached多线程模型:
Memcached分布式布置方案:
Redis
Redis把整个数据库全加载到内存中进行操作,通过异步操作定期把数据库数据flush到硬盘保存
Reids特点:
安装Redis:
http://www.cnblogs.com/fslnet/p/3759284.html
安装php扩展redis:
sudo apt-get install php5-redis
redis默认端口为:6379
redis配置文件(待整理)
redis key相关命令:
exits key //key是否存在,返回0/1
del key1 key2.. //删除指定key,返回删除key的数目,0表示key都不存在
type key //返回给定key的value类型,none表示不存在key
types pattern //返回匹配指定模式的所有key
expire key seconds //设置指定key的过期时间
randomkey //返回当前数据库中随机的一个key,如果数据库为空,返回空字符串
rename oldkey newkey //重命名key
renamenx oldkey newkey //重命名key,如果newkey存在返回失败
ttl key //返回设置过期时间key的剩余秒数,-1表示key不存在或没有设置过期时间
move key db-index //将key从当前数据库移动到指定的数据库,返回1成功,0表示不存在或已在指定数据库
未完待续……