十二月
21
2016

笔记019 通过 spl_autoload_register 实现自动加载

spl_autoload_register (PHP 5 >= 5.1.2, PHP 7) spl_autoload_register — 注册给定的函数作为 __autoload 的实现 语法 bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) 说明 通过这个函数,可以为加载的类指定寻址方式,这样就不用大批量地 require 和 include 了。系统会自动按照指定的规则,到对应的位置下面去寻找需要实例化的类。虽然这个方法比较底层,在有框架的情况下,一般都不需要我们去做这些工作了。但是难免还是有要用的时候,比如我写这个博客的时候,我就自己需要捣腾脚本,这个时候,就绕不开了。下面的例子,就是我的脚本中要用的一个简单的自动加载的程序。 例子 spl_autoload_register(function ($class) { $rootPath = realpath(sprintf('%s/..', __DIR__)); $paths = array( 'src', ); foreach ($paths as $path) { if (is_file( $file = $rootPath . DIRECTORY_SEPARATOR . $path . DIRECTORY_SEPARATOR . $class . '.php' )) { include $file; break; } } }); 注意,匿名函数是 PHP 5.3 及以上 才可以用的,如果发现不能用,检查一下自己的 PHP 版本。我这里只是简单地指定所有的类在我的 src 文件夹下寻找,类名与文件名完全一致。
六月
28
2016

笔记018 PHP中的 constant() 函数

语法 mixed constant ( string $name ) 说明 constant() 函数用于返回一个常量的值。当预先不知道常量的名称,却需要取得该常量的值的时候,该函数特别有用。 通过向 $name 参数传递常量的名称,便可获得对应常量的值。 该函数对于类常量依然适用。 返回值 返回常量的值,若常量未定义,则返回 null,但此时会产生一个 E_WARNING 级别的错误。 示例 <?php define("MAXSIZE", 100); echo MAXSIZE; echo constant("MAXSIZE"); // same thing as the previous line interface bar { const test = 'foobar!'; } class foo { const test = 'foobar!'; } $const = 'test'; var_dump(constant('bar::'. $const)); // string(7) "foobar!" var_dump(constant('foo::'. $const)); // string(7) "foobar!"
二月
24
2016

笔记017 PHP中的 session_set_save_handler() 函数

函数说明 session_set_save_handler 函数用于设置用户自定义会话存储。 如果想使用 PHP 内置的会话存储机制之外的方式, 可以使用本函数。 例如,可以自定义会话存储函数来将会话数据存储到数据库。 用法 bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] ) 从 PHP 5.4 版本开始,可以直接使用更简单的参数进行自定义会话存储设置: bool session_set_save_handler ( SessionHandlerInterface $sessionhandler [, bool $register_shutdown = true ] ) 参数说明 该参数有两种原型: 第一种原型(PHP 5.4+ 版本可用)为: sessionhandler 实现了 SessionHandlerInterface 接口的对象,该对象你可以自定义,也可以使用官方提供的 SessionHandler register_shundown 将函数 session_write_close() 注册为 register_shutdown_function() 函数。 第二种原型为: open(string $savePath, string $sessionName) open 回调函数类似于类的构造函数, 在会话打开的时候会被调用。 这是自动开始会话或者通过调用 session_start() 手动开始会话 之后第一个被调用的回调函数。 此回调函数操作成功返回 true,反之返回 false。 close() close 回调函数类似于类的析构函数。 在 write 回调函数调用之后调用。 当调用 session_write_close() 函数之后,也会调用 close 回调函数。 此回调函数操作成功返回 true,反之返回 false。 read(string $sessionId) 如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 如果会话中没有数据,read 回调函数返回空字符串。 在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。 在调用 read 之前,PHP 会调用 open 回调函数。 read 回调返回的序列化之后的字符串格式必须与 write 回调函数保存数据时的格式完全一致。 PHP 会自动反序列化返回的字符串并填充 $_SESSION 超级全局变量。 虽然数据看起来和 serialize() 函数很相似, 但是需要提醒的是,它们是不同的。 write(string $sessionId, string $data) 在会话保存数据时会调用 write 回调函数。 此回调函数接收当前会话 ID 以及 $_SESSION 中数据序列化之后的字符串作为参数。 序列化会话数据的过程由 PHP 根据 session.serialize_handler 设定值来完成。 序列化后的数据将和会话 ID 关联在一起进行保存。 当调用 read 回调函数获取数据时,所返回的数据必须要和 传入 write 回调函数的数据完全保持一致。 PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用此回调函数。 注意,在调用完此回调函数之后,PHP 内部会调用 close 回调函数。 注意: PHP 会在输出流写入完毕并且关闭之后 才调用 write 回调函数, 所以在 write 回调函数中的调试信息不会输出到浏览器中。 如果需要在 write 回调函数中使用调试输出, 建议将调试输出写入到文件。 destroy($sessionId) 当调用 session_destroy() 函数, 或者调用 session_regenerate_id() 函数并且设置 destroy 参数为 true 时, 会调用此回调函数。此回调函数操作成功返回 true,反之返回 false。 gc($lifetime) 为了清理会话中的旧数据,PHP 会不时的调用垃圾收集回调函数。 调用周期由 session.gc_probability 和 session.gc_divisor 参数控制。 传入到此回调函数的 lifetime 参数由 session.gc_maxlifetime 设置。 此回调函数操作成功返回 true,反之返回 false。 create_sid() 当需要新的会话 ID 时被调用的回调函数。 回调函数被调用时无传入参数, 其返回值应该是一个字符串格式的、有效的会话 ID。 返回值 成功时返回 true, 或者在失败时返回 false。 参考链接 官方文档地址
十二月
18
2015

笔记016 PHP中的 get_class() 函数

get_class() 的作用是返回对象的类名。返回 obj 对象对应的类名,如果 obj 不是对象,则会返回 false。通过这个方法,我们在写一些底层相关的代码的时候,可以轻松很多。注意:自 PHP 5 起,如果在对象的方法中调用则 obj 为可选项。

阅读全文>>

十二月
16
2015

笔记015 PHP中?:的特殊用法

从 PHP 5.3 版本开始,三目运算符已经可以将?:连在一起使用了,这是一个相当有用的改变,可以帮我们精简代码,使整个代码更加便于阅读。所以Hy369迫不及待地将其写入了自己的PHP博客中,赞一个。

阅读全文>>

十一月
05
2015

笔记014 PHP正则表达式的分隔符

写在前面 Hy369平时使用的 PHP 正则分隔符是斜杠(/,forward slash)。甚至于一度以为PHP的正则分隔符就只有这个。 嘿嘿,直到今日,看到一个颇为奇怪的以 # 号作为正则分隔符的例子。看到这个”奇怪“的正则表达式,我忍不住找度娘问了一下。结果就是:我愣住了。 真的,直到这一刻,我才直到,PHP下的正则分隔符,其实并非只能是 / 的。 好了,接下来记录一下这个让 Hy369 颇为惊喜的知识点吧。 PHP 正则表达式的分隔符 PHP中,正则表达式的分隔符,可以是除了:字母、数字、反斜杠、空白字符 以外的任何字符。 经常使用的分隔符有:斜杠(/,forward slash),井号(#,hash sign)和波浪号(~,tilde)。 也就是说,可以是下面这些模式: /test string/ #^[^0-9]Hy369$# +php blog+ %[A-Za-z0-9_-]% 要点说明 如果在某个模式中,正则表达式中需要使用到这个模式中的分隔符,则需要在这个分隔符前面添加反斜杠。例如: /http:\/\// 在这种情况下,整个正则表达式显得不是很直观。这个时候,就可以考虑换一个分隔符,用以增强正则表达式的可读性了。因此,上面的正则表达式可以替换为这样: #http://#
十月
22
2015

笔记013 PHP中 is_callable() 的作用及其与 method_exists() 的区别

is_callable() 的作用 最近接触到了 is_callable() 方法,以前都是通过 method_exissts() 方法进行相关的逻辑处理,直到今日接触到 is_callable() 方法,才发现两者有着很大的相似之处。 is_callable() 方法的语法结构为: bool is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]] ) 作用是验证变量的内容能否作为函数进行调用。参数1 name 是需要检查的回调函数名,若是一个对象的方法,这需要一个数组作为参数1.这时的参数应该是如下的结构: array(类的实例, 方法名) 参数2 syntax_only 则是一个布尔值,若设置为 true,则这个函数仅仅验证 name 是否是函数或者方法的语法,并不会真正检测该函数是否存在。 参数3 callable_name 则用于接收“可调用的名称”,普通的函数会返回函数名,类中的方法则会返回形如:someClass::someMethod这样的字串。 is_callable() 与 method_exists() 的区别 method_exists() 函数的参数为一个对象(或类名)和一个方法名,如果给定方法在对象的类中存在,则返回 true。 两者的区别是: 在php5中,一个方法存在并不意味着它就可以被调用。对于 private,protected 和 public 类型的方法,method_exits() 会返回 true,但是is_callable() 会检查存在,同时也会检测其是否可以访问,如果是 private,protected 类型的,它会返回 false。
十月
10
2015

笔记012 PHP中的list语言结构

PHP中有一种和函数用法很相似的东西,叫做语法结构。因为这种特性,一般将其归于函数中进行介绍。目前Hy369接触到的语法结构有:echo,print,array。当然此次提到的list也是一种语法结构。 至于还有没有其他的语法结构,Hy369也没有特别去深究这个,所以不甚清楚,以后注意到再说吧。 list的作用是用数组为一组变量赋值。其语法为: list(var1,var2...) 通过list可以很方便地将数组中的值赋予指定的变量。这里给出两个例子: <?php $a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse"); print_r($a); 输出结果为: Array ( [a] => Dog [b] => Cat [c] => Horse ) <?php $my_array = array("Dog","Cat","Horse"); list($a, , $c) = $my_array; echo "Here I only use the $a and $c variables."; Here I only use the Dog and Horse variables. 仔细注意一下第二个例子。Hy369以前就为了获得非第一个数组的值,写过类似list($a,$b,$c) = $array的代码,然后输出我仅仅需要的$c的值。当时还不知道可以直接写成list(,,$c)=$arra就可以了(注意逗号)。现在想来,还是略微有些汗颜啊。
十月
09
2015

笔记011 PHP变参函数的实现

经常使用Js中的变参函数,觉得使用起来甚是方便。突然想到PHP中是否也能够实现相关的功能呢? 找度娘问了问,度娘告诉我这个想法是可行的。也就是在搜索的过程中,func_get_arg 和 func_get_args 两个函数进入了我的眼帘。这两个函数以前倒是接触过,大致知道有这么个东西,不过当时因为没有这方面的需求,也没有这方面的考虑,所以没有对两个函数的用法做深入了解。 func_get_arg 这个函数的作用是获取一个函数中指定的参数值。语法格式为:func_get_arg(arg_num),其中的 arg_num 指的是参数的数字索引。程序的世界里,第一个数字不是1,而是0,这个相信不必多说。 func_get_args这个函数的作用则是获取一个函数中的所有参数值,以数组的方式返回。该函数无需传递参数。这个函数则是实现变参函数的关键。 通过在一个函数中使用func_get_args这个函数获取到该函数的所有参数,再对这些参数作一定的逻辑处理,也就是根据参数的不同,进行不同的逻辑操作,也就实现了我们需要的变参函数了。 还有个函数为:func_num_args,这个函数的作用是返回所在函数中的参数的个数,使用这个函数结合着前面提到的函数,可以更加方便地实现我们需要的功能。 具体的例子Hy369就不在博客中提供了(其实这是在为自己的懒找借口),明白了原理,实现变参函数应该没有什么问题了,毕竟我们都是传说中的攻城狮不是,哈哈。
九月
24
2015

笔记010 PHP中 == 比较运算符注意事项

最近在进行比较运算的时候,遇到了一些问题,细节问题,平时忽略了,没想这次问题就出来了。 PHP中的 `==` 比较运算符表示:当两个数据的值相等的时候,返回 `true` ,反之则返回 `false`。注意,这里说的是值相当的时候,结果就为 `true`,也就是说,这里并不会去比较值的类型。比如:`12 == '12'` 结果会是 `true`。

阅读全文>>