本节内容:
PHP编程之魔术方法与魔术常量
PHP把类中所有以__(两个下划线)开头的方法当成魔术方法,一般建议用户不要将自定义的方法前面加上__作为前缀。
一,魔术方法:
1. __construct()
类的默认构造方法,如果__construct()和与类同名的方法共同出现时,默认调用__construct()而不是同类名方法。一般情况下用户自定义构造方法也会使用__construct()。
2. __destruct()
类的析构函数,当该对象的所有引用都被删除,或者对象被显式销毁时执行。
3. __get($name)
用$object->a的方式读取对象的属性时,如果属性a存在且是public型,那么直接返回该属性的值;如果属性a不存在或者是protected/private这样的不可直接访问的类型,就会调用__get($name)方法并以返回值为准。一般可以使用该方法使外部可限制性地访问内部属性,或者完成类似java中的反射操作。
4. __set($name, $value)
与__get($name)类似,用$object->a = 17的方式给属性赋值时,如果属性a存在且是public型,那么直接给属性a赋值皆可;如果属性a不存在或者是protected/private型,就会调用__set($name, $value)方法。
5. __call($name, $arguments) / __callStatic($name, $arguments)
当调用不存在或者不可访问的方法时,会调用__call($name, $arguments)方法。而当在静态方法中调用不存在或者不可访问的方法时,会调用__callStatic($name, $arguments)方法。
6. __toString()
当打印对象时会被直接调用。如echo $object;
7. __clone()
当对象被拷贝时直接调用。如$a = new Action(); $a = $object;
8. __isset()($name) / __unset($name)
对不存在或者不可访问的属性使用isset()或者empty()时,__isset()会被调用;当unset一个不存在或者不可访问的属性时,__unset()会被调用,否则直接unset该属性皆可。
9. __set_state()
用var_export()输出一个对象时,__set_state()会被调用,输出内容以该魔术方法的返回值为准。
注:var_export()和var_dump()类似,只是var_export()输出的内容符合php语法。
注意,使用方法:
<?php
$test = new Test();
$b = var_export($test, true);
var_dump($b);
class Test {
public $a;
public static function __set_state($array) {
$ab = new Test();
$ab->a = 10;
return $ab;
}
}
实例化一个对象时,如果对应的类不存在,则该方法被调用。注意:该方法是全局函数,参数是类的名称。
11. __sleep() / __wakup()
略。
二,魔术常量:
PHP的魔术常量是通过扩展库定义的,比如以下几种魔术常量的值就会随着它们在代码中的位置改变而改变:
__LINE__ 该php文件中的当前行号
__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,如果用在被包含文件中,则返回被包含的文件名。__FILE__总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。
__FUNCTION__ 函数名称。自php5起本常量返回该函数被定义时的名字(区分大小写)。php4时总为小写字母。
__CLASS__类的名称。php5区分大小写,php4总为小写字母。
__METHOD__类的方法名,区分大小写,返回形式:class::function。
__NAMESPACE__ 当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的。
本节内容:
一例php文件缓存类的代码
例子:
/**
* 文件缓存类
* @author flynetcn
* @site wwww.
*/
class FileCache
{
const CACHE_DIR = '/tmp/cache';
private $dir;
private $expire = 300;
/**
* @param $strDir 缓存子目录(方便清cache)
*/
function __construct($strDir='')
{
if ($strDir) {
$this->dir = self::CACHE_DIR.'/'.$strDir;
}
}
private function getFileName($strKey)
{
return $this->dir.'/'.$strKey;
}
public function setExpire($intSecondNum)
{
if ($intSecondNum<10 || !is_int($intSecondNum)) {
return false;
}
$this->expire = $intSecondNum;
return true;
}
public function getExpire()
{
return $this->expire;
}
public function get($strKey)
{
$strFileName = $this->getFileName($strKey);
if (!@file_exists($strFileName)) {
return false;
}
if (filemtime($strFileName) < (time()-$this->expire)) {
return false;
}
$intFileSize = filesize($strFileName);
if ($intFileSize == 0) {
return false;
}
if (!$fp = @fopen($strFileName, 'rb')) {
return false;
}
flock($fp, LOCK_SH);
$cacheData = unserialize(fread($fp, $intFileSize));
flock($fp, LOCK_UN);
fclose($fp);
return $cacheData;
}
public function set($strKey, $cacheData)
{
if (!is_dir($this->dir)) {
if (!@mkdir($this->dir, 0755, true)) {
trigger_error("mkdir({$this->dir}, 0755, true) failed", E_USER_ERROR);
return false;
}
}
$strFileName = $this->getFileName($strKey);
if (@file_exists($strFileName)) {
$intMtime = filemtime($strFileName);
} else {
$intMtime = 0;
}
if (!$fp = fopen($strFileName,'wb')) {
return false;
}
if (!flock($fp, LOCK_EX+LOCK_NB)) {
fclose($fp);
return false;
}
if (time() - $intMtime < 1) {
flock($fp, LOCK_UN);
fclose($fp);
return false;
}
fseek($fp, 0);
ftruncate($fp, 0);
fwrite($fp, serialize($cacheData));
flock($fp, LOCK_UN);
fclose($fp);
@chmod($strFileName, 0755);
return true;
}
}
本节内容:
php curl模拟post
代码:
/**
* php curl post
* site: www.
*/
function curl_post($strUrl, $arrData=array(), $boolUseCookie=false)
{
$strData = array();
foreach ($arrData as $k => $v) {
$strData[] = "$k=$v";
}
$strData = $strData ? implode('&', $strData) : '';
$ch = curl_init($strUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $strData);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
if ($boolUseCookie && is_array($_COOKIE) && count($_COOKIE) > 0) {
$cookie_str = '';
foreach($_COOKIE as $key => $value) {
$cookie_str .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie_str);
}
$response = curl_exec($ch);
if (curl_errno($ch) != 0) {
//echo curl_error($ch);
return false;
}
curl_close($ch);
return $response;
}
您可能感兴趣的文章:
php curl模块的用法举例
PHP添加CURL扩展库的二种方法
php curl超时设置详解
php CURL模拟cookie登录的代码
PHP CURL获取cookies模拟登录的方法介绍
php curl提交GET,POST,Cookie的简单实例
php curl上传文件的简单例子
php中开启curl扩展的方法详解
php curl post的简单示例
php curl 学习总结