1、超级简单的页面缓存如果你的工程项目不是基于CMS系统或框架,打造一个简单的缓存系统将会非常实在。下面的代码很简单,但是对小网站而言能切切实实解决问题。<?php//definethepathandnameofcachedfile$cachefile='cached-files/'.date('M-d-Y').'.php';//definehowlongwewanttokeepthefileinseconds.Isetmineto5hours.$cachetime=18000;//Checkifthecachedfileisstillfresh.Ifitis,serveitupandexit.if(file_exists($cachefile)&&time()-$cachetime<filemtime($cachefile)){include($cachefile);exit;}//ifthereiseithernofileORthefiletotooold,renderthepageandcapturetheHTML.ob_start();?><html>outputallyourhtmlhere.</html><?php//We'redone!Savethecachedcontenttoafile$fp=fopen($cachefile,'w');fwrite($fp,ob_get_contents());fclose($fp);//finallysendbrowseroutputob_end_flush();?>2、在PHP中计算距离这是一个非常有用的距离计算函数,利用纬度和经度计算从A地点到B地点的距离。该函数可以返回英里,公里,海里三种单位类型的距离。functiondistance($lat1,$lon1,$lat2,$lon2,$unit){$theta=$lon1-$lon2;$dist=sin(deg2rad($lat1))*sin(deg2rad($lat2))+cos(deg2rad($lat1))*cos(deg2rad($lat2))*cos(deg2rad($theta));$dist=acos($dist);$dist=rad2deg($dist);$miles=$dist*60*1.1515;$unit=strtoupper($unit);if($unit=="K"){return($miles*1.609344);}elseif($unit=="N"){return($miles*0.8684);}else{return$miles;}}echodistance(32.9697,-96.80322,29.46786,-98.53506,"k")."kilometers";3、将秒数转换为时间(年、月、日、小时…)这个有用的函数能将秒数表示的事件转换为年、月、日、小时等时间格式。functionSec2Time($time){if(is_numeric($time)){$value=array("years"=>0,"days"=>0,"hours"=>0,"minutes"=>0,"seconds"=>0,);if($time>=31556926){$value["years"]=floor($time/31556926);$time=($time%31556926);}if($time>=86400){$value["days"]=floor($time/86400);$time=($time%86400);}if($time>=3600){$value["hours"]=floor($time/3600);$time=($time%3600);}if($time>=60){$value["minutes"]=floor($time/60);$time=($time%60);}$value["seconds"]=floor($time);return(array)$value;}else{return(bool)FALSE;}}4、强制下载文件一些诸如mp3类型的文件,通常会在客户端浏览器中直接被播放或使用。如果你希望它们强制被下载,也没问题。可以使用以下代码:functiondownloadFile($file){$file_name=$file;$mime='application/force-download';header('Pragma:public');//requiredheader('Expires:0');//nocacheheader('Cache-Control:must-revalidate,post-check=0,pre-check=0');header('Cache-Control:private',false);header('Content-Type:'.$mime);header('Content-Disposition:attachment;filename="'.basename($file_name).'"');header('Content-Transfer-Encoding:binary');header('Connection:close');readfile($file_name);//pushitoutexit();}5、使用GoogleAPI获取当前天气信息想知道今天的天气?这段代码会告诉你,只需3行代码。你只需要把其中的ADDRESS换成你期望的城市。$xml=simplexml_load_file('http://www.google.com/ig/api?weather=ADDRESS');$information=$xml->xpath("/xml_api_reply/weather/current_conditions/condition");echo$information[0]->attributes();6、获得某个地址的经纬度随着GoogleMapsAPI的普及,开发人员常常需要获得某一特定地点的经度和纬度。这个非常有用的函数以某一地址作为参数,返回一个数组,包含经度和纬度数据。functiongetLatLong($address){if(!is_string($address))die("AllAddressesmustbepassedasastring");$_url=sprintf('http://maps.google.com/maps?output=js&q=%s',rawurlencode($address));$_result=false;if($_result=file_get_contents($_url)){if(strpos($_result,'errortips')>1||strpos($_result,'Didyoumean:')!==false)returnfalse;preg_match('!center:\s*{lat:\s*(-?\d+\.\d+),lng:\s*(-?\d+\.\d+)}!U',$_result,$_match);$_coords['lat']=$_match[1];$_coords['long']=$_match[2];}return$_coords;}
1、(用php自带系统变量得到当前域名) 不支持系统变量的主机无法获得,只能获得当前网页的域名echo$_SERVER['HTTP_HOST'];2、(用自带函数获取域名)$url='https://www.zhansanjie.com'; $arr_url=parse_url($url); echo$arr_url['host'];3、(使用正则表达式来匹配出域名)preg_match("/^(http://)?([^/]+)/i",$url,$arr_domain); echo$arr_domain[2];
php虽然不能像js那样直接newObject,但php支持匿名类我们直接新建匿名类进行转换就好了protectedfunctionarrayTransitionObject(Array$array){if(is_array($array)){$obj=newclass{};foreach($arrayas$key=>$val){$obj->$key=$val;}}else{$obj=$array;}return$obj;}
1、__get、__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get($property) 当调用一个未定义的属性时访问此方法__set($property,$value) 给一个未定义的属性赋值时调用这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)2、__isset、__unset__isset($property)当在一个未定义的属性上调用isset()函数时调用此方法__unset($property)当在一个未定义的属性上调用unset()函数时调用此方法与__get方法和__set方法相同,这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)3、__call__call($method,$arg_array)当调用一个未定义(包括没有权限访问)的方法是调用此方法4、__autoload__autoload函数,使用尚未被定义的类时自动调用。通过此函数,脚本引擎在PHP出错失败前有了最后一个机会加载所需的类。注意:在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误。5、__construct、__destruct__construct构造方法,当一个对象被创建时调用此方法,好处是可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么,这样你在改变类的名称时,就不需要改变构造方法的名称__destruct析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.,析构函数允许你在使用一个对象之后执行任意代码来清除内存,当PHP决定你的脚本不再与对象相关时,析构函数将被调用.,在一个函数的命名空间内,这会发生在函数return的时候,对于全局变量,这发生于脚本结束的时候,如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。6、__clonePHP5中的对象赋值是使用的引用赋值,使用clone方法复制一个对象时,对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。7、__toString __toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时,如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchablefatalerror:Objectofclasstestcouldnotbeconvertedtostringin,此方法必须返回一个字符串。在PHP5.2.0之前,__toString方法只有结合使用echo()或print()时才能生效。PHP5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但不能用于非字符串环境(如使用%d修饰符)。从PHP5.2.0,如果将一个未定义__toString方法的对象转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。8、__sleep、__wakeup__sleep串行化的时候用__wakeup反串行化的时候调用serialize()检查类中是否有魔术名称__sleep的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。使用__sleep的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。相反地,unserialize()检查具有魔术名称__wakeup的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用__wakeup的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。9、__set_state当调用var_export()时,这个静态方法会被调用(自PHP5.1.0起有效)。本方法的唯一参数是一个数组,其中包含按array(’property’=>value,…)格式排列的类属性。10、__invoke当尝试以调用函数的方式调用一个对象时,__invoke方法会被自动调用。PHP5.3.0以上版本有效11、__callStatic它的工作方式类似于__call()魔术方法,__callStatic()是为了处理静态方法调用,PHP5.3.0以上版本有效,PHP确实加强了对__callStatic()方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call()魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。
PHP下载远程图片的几种方法总结本文演示3个从远程URL下载图片,并保存到本地文件中的方法,包括file_get_contents,curl和fopen。1、使用file_get_contentsfunctiondlfile($file_url,$save_to){$content=file_get_contents($file_url);file_put_contents($save_to,$content);}2、使用CURLfunctiondlfile($file_url,$save_to){$ch=curl_init();curl_setopt($ch,CURLOPT_POST,0);curl_setopt($ch,CURLOPT_URL,$file_url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$file_content=curl_exec($ch);curl_close($ch);$downloaded_file=fopen($save_to,'w');fwrite($downloaded_file,$file_content);fclose($downloaded_file);}3、使用fopenfunctiondlfile($file_url,$save_to){$in=fopen($file_url,"rb");$out=fopen($save_to,"wb");while($chunk=fread($in,8192)){fwrite($out,$chunk,8192);}fclose($in);fclose($out);}下载与保存完整方法(输出日志那行可删除):privatefunctiondownloadImage($url){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30);$file=curl_exec($ch);curl_close($ch);$this->saveAsImage($url,$file);}privatefunctionsaveAsImage($url,$file){$filename=pathinfo($url,PATHINFO_BASENAME);$dirname=pathinfo(parse_url($url,PHP_URL_PATH),PATHINFO_DIRNAME);$path='public'.$dirname.'/';$fullpath='public'.$dirname.'/'.$filename;//如果目录不存在,则创建if(!is_dir($path)){mkdir($path,0777,true);}if(file_exists($fullpath)){//$this->output->writeln("【已存在】输出路径".$fullpath);}else{$resource=fopen($fullpath,'a');fwrite($resource,$file);fclose($resource);//$this->output->writeln("【已保存】输出路径".$fullpath);}}
public【公共的】可以在程序中的任何位置(类内、类外)被其他的类和对象调用。子类可以继承和使用父类中所有的公共成员。Private【私有的】被private修饰的变量和方法,只能在所在的类的内部被调用和修改,不可以在类的外部被访问。在子类中也不可以。如果直接调用,就会发生错误。Protect【受保护的】用protected修饰的类成员,可以在本类和子类中被调用,但是在其他地方不能被调用。
最基本的php中生成类,首先就要先定义类,包括成员变量和成员方法等,还要设计构造函数给成员变量赋值。有没有一种快捷的方式,能够迅速创建出空对象,并对对象的成员变量赋值。下面提供两种迅速生成空对象的方式,然后迅速对对象赋值。方法1.定义空类,空类生成空对象,然后对对象的成员变量赋值方法2.使用stdClass直接生成空对象下面附代码:<?php//php创建空类的两种方法//方法1.classCfg{}$girl=newCfg();$girl->name='tom';echo$girl->name."</br>";//方法2.$boy=newstdClass();$boy->name="lucky";echo$boy->name."</br>";
$num="13966778888"$str=substr_replace($num,'****',3,4);自定义函数手机号隐藏中间四位functionyc_phone($str){$str=$str;$resstr=substr_replace($str,'****',3,4);return$resstr;}
php的引用(就是在变量或者函数、对象等前面加上&符号)在PHP中引用的意思是:不同的名字访问同一个变量内容。 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容,在内存中存放的地址。1.变量的引用 PHP的引用允许你用两个变量来指向同一个内容<?php$a='abc';$b=&$a;var_dump($a,$b);//均为'abc'$b=123;var_dump($a,$b);//均为1232.函数的引用传递(传址调用)<?phpfunctiontest(&$a){$a=$a+100;}$b=1;test($b);var_dump($b);//101这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值注意: 上面的“test($b);”中的$b前面不要加&符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要&符号<?phpfunctiontest(&$a){$a=$a+10;}$b=1;call_user_func_array('test',array(&$b));var_dump($b);//113.函数的引用返回function&test(){static$b=0;//申明一个静态变量$b=$b+1;echo$b;return$b;}$a=test();//这条语句会输出 $b的值 为1$a=5;$a=test();//这条语句会输出 $b的值 为2$a=&test();//这条语句会输出 $b的值 为3$a=5;$a=test();//这条语句会输出 $b的值 为6通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别。$a=test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变都不会影响到函数中的$b而通过$a=&test()方式调用函数呢,他的作用是将return$b中的$b变量的内存地址与$a变量的内存地址指向了同一个地方。这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中:classtalker{private$data='Hi';publicfunction&get(){return$this->data;}publicfunctionout(){echo$this->data;}}$aa=newtalker();$d=&$aa->get();$aa->out();$d='How';$aa->out();$d='Are';$aa->out();$d='You';$aa->out();//输出为HiHowAreYou
1.方法传参(1).值传递:functionfunc_name($var);方法内部改变参数的值不影响方法外部参数的值(2).引用传递:functionfunc_name(&$var);方法内部改变参数的值会改变方法外部参数的值,传入的是参数的引用地址2.可变数量的参数列表a). int func_num_args(void):返回传入方法的参数数目,整型b). array func_get_args(void):返回传入方法的参数列表数组c). mixed func_get_arg(int$arg_num):返回方法参数列表的指定的参数,参数$arg_num对应func_get_args()返回数组中的键,即索引使用此类方法不需要在自定义方法中定义接收参数列表,如例:<?phpclassGetArgs{functionget_args_num(){$args_num=func_num_args();//获取参数列表中参数的数目return$args_num;}functionget_args(){$args=func_get_args();//接收传入的所有参数,可以以数组方式使用参数:$args[0],$args[1],...对应参数列表顺序return$args;}functionget_arg(){$arg_num=1;$arg=func_get_arg($arg_num);//获取索引为1的参数,如果索引值超出则会警告return$arg;}}$ga=newGetArgs();echo$ga->get_args_num(1,2,3);//3print_r($ga->get_args(1,2,3));//Array([0]=>1[1]=>2[2]=>3)echo$ga->get_arg(1,2,3);//2