分类归档:Web相关

分段加载延长PHP页面执行的时间

处理大数据的时候可以采用分段加载的方法

test.php

limit一下数据

然后在执行一段后添加以下代码

echo '<meta http-equiv="refresh" content="5; url=http://www.coolaj.cn/test.php?begin=xx">';

 

linux下定时执行PHP

1 /etc/crontab文件
在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。
如:
[root@dave ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

2 /etc/cron.deny和/etc/cron.allow文件
/etc/cron.deny表示不能使用crontab命令的用户
/etc/cron.allow表示能使用crontab的用户。
如果两个文件同时存在,那么/etc/cron.allow优先。
如果两个文件都不存在,那么只有超级用户可以安排作业。

每个用户都会生成一个自己的crontab文件。这些文件在/var/spool/cron目录下:
如:
[root@dave ~]# cd /var/spool/cron
[root@dave cron]# ls
oracle root

我们直接查看这个文件,里面的内容和对应用户显示的crontab -l一致。
[root@dave cron]# cat oracle
00 6 * * * /u02/scripts/del_st_archive.sh >/u02/scripts/del_st_arch.log 2>&1
[root@dave cron]# cat root
0 12 * * * /root/bin/sync-clock.sh
[root@dave cron]#

Crontab使用说明
1 Crontab语法
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e     (edit user’s crontab)
-l     (list user’s crontab)
-r     (delete user’s crontab)
-i     (prompt before deleting user’s crontab)
-s     (selinux context)
其中,file是命令文件的名字。如果在命令行中指定了这个文件,那么执行crontab命令,则将这个文件拷贝到crontabs目录下;如果在命令行中没有制定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将他们也存放在crontab目录下。

帮助:
[root@dave ~]# man crontab
CRONTAB(1)                                                         CRONTAB(1)
NAME
crontab – maintain crontab files for individual users (ISC Cron V4.1)
SYNOPSIS
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]

2 Crontab格式说明
我们可以用crontab -e添加要执行的命令。命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。
添加的命令必须以如下格式:
* * * * * /command path
前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。各个字段之间用spaces和tabs分割。
前5个字段分别表示:
分钟:0-59
小时:1-23
日期:1-31
月份:1-12
星期:0-6(0表示周日)
还可以用一些特殊符号:
*:表示任何时刻
,: 表示分割
-:表示一个段,如第二端里:1-5,就表示1到5点
/n :表示每个n的单位执行一次,如第二段里,*/1,就表示每隔1个小时执行一次命令。也可以写成1-23/1.
一些示例:
00 8,12,16 * * * /data/app/scripts/monitor/df.sh
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh
43 21 * * * 21:43执行
15 05 * * *  05:15执行
0 17 * * * 17:00执行
0 17 * * 1每周一的17:00执行
0,10 17 * * 0,2,3每周日,周二,周三的17:00和17:10执行
0-10 17 1 * *毎月1日从17:00到7:10毎隔1分钟执行
0 0 1,15 * 1毎月1日和15日和一日的0:00执行
42 4 1 * *  毎月1日的4:42分执行
0 21 * * 1-6  周一到周六21:00执行
0,10,20,30,40,50 * * * * 每隔10分执行
*/10 * * * *      每隔10分执行
* 1 * * *        从1:0到1:59每隔1分钟执行
0 1 * * *        1:00执行
0 */1 * * *       毎时0分每隔1小时执行
0 * * * *        毎时0分每隔1小时执行
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02执行
30 5 1,15 * *      1日和15日的5:30执行

3 &后台执行命令
当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。
如:30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &
在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。
不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
如:command >out.file 2>&1 &
在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file的文件中。

4 2>&1含义
先看一个例子:
0 2 * * * /u01/test.sh >/dev/null 2>&1 &
这句话的意思就是在后台执行这条命令,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空。
在这里有有几个数字的意思:
0表示键盘输入
1表示标准输出
2表示错误输出.
我们也可以这样写:
0 2 * * * /u01/test.sh >/u01/out.file & –这里没写,默认是1
0 2 * * * /u01/test.sh 1>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file 2>&1 &

将tesh.sh命令输出重定向到out.file,即输出内容不打印到屏幕上,而是输出到out.file文件中。
2>&1是将错误输出重定向到标准输出。然后将标准输入重定向到文件out.file。
&1表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。
&:后台执行
测试:
ls 2>1:不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1:没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1:不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1 == ls xxx 1>out.txt 2>&1; 因为重定向符号>默认是1,这句就把错误输出和标准输出都传到out.txt文件中。

5 2>&1写在后面的原因
格式:command > file 2>&1  == command 1> file 2>&1
首先是command > file将标准输出重定向到file中,2>&1是标准错误拷贝了标准输出,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
如果改成:command 2>&1 >file
2>&1标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file后输出才被重定向到file,但标准错误仍然保持在终端。

 

//—————————————————————–

1、[root@www opt]# vim /etc/crontab

在crontab文件中加入下面的内容:
0 3 * * * root sh /usr/local/sh/update_yuce.sh

2、update_yuce.sh文件的内容为:

#!/bin/bash

/usr/local/php/bin/php /usr/local/www/spider/update_yuce.php >> /usr/local/sh/update_yuce.log

其中/usr/local/php/bin/php表示php引擎所在的目录,

/usr/local/www/spider/update_yuce.php表示PHP文件所在的位置

/usr/local/sh/update_yuce.log为日志文件

以上即可实现定时执行某个PHP文件,也可用下面的类似方法:

[root@www opt]# vim /etc/crontab
在crontab文件中加入下面的内容:
0 3 * * *  cd  /usr/local/www/spider  /usr/local/bin/php ./update_yuce.php

crontab 的补充说明
根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令,使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件 /var/spool/cron/username 中。

cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。
控制对 cron 的使用

/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

无论使用控制文件中的规定如何,根用户都总是可以使用 cron。

如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。

如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。
启动和停止服务

 

//————————————————————————————-

*/1 * * * * root sh /usr/local/www/test/bat/task.sh

 

task.sh文件

#!/bin/bash
wget –spider http://www.xxx.com/event/bmcevent
date >> /usr/local/www/test/bat/crontab.log    #记录执行时间

windows下PHP批量生成打包android程序APK

服务器安装php环境

下载 android-sdk-windows  下载JDK

1.打开zip支持 c:/windows/php.ini ,打开 exec

2.apk 支持
mime添加 .apk application/vnd.android.package-archive

3.安装javaSDK(要和android的编辑版本一致)

4.编辑IIS绑定权限(www:www) ,目录没有权限会导致生成失败

5.配置两个虚拟主机

A:down.coolaj.cn  用于下载

B:make.cookaj.cn  用于制作签名

6. down的index.php

<?php
/*
 * Created on 2012-5-21
 * coolaj.cn
 */

// var_dump($id);

function cocode() {

	 foreach($_GET as $k=>$v){
		$id = $k;
		break;
	 }
	 if($_GET['u']){
		$id=$_GET['u'];
	 }
	if(is_numeric($id)){
		return $id;
	}elseif ($id && preg_match('/^U/', $id)) {	
		$id = base64_decode(substr($id,1).'=')>>2;
		return $id;
	}
}

$id = cocode();

if(file_exists('bbshenqi'.$id.".apk") || empty($id)){
	if(empty($id)){
		header('Location: http://www.coolaj.cn/bbshenqi.apk');
		exit;
	}
	header('Location: http://down.coolaj.cn/bbshenqi'.$id.'.apk');
}else{
	$cc =file_get_contents("http://make.coolaj.cn/makeapk.php?apkname=".$id.'&r=简单加密');
	if($cc == 'ok'){
		if(file_exists('bbshenqi'.$id.".apk")){
			echo '<meta http-equiv="content-type" content="text/html; charset=gbk" />';
			echo '<a href="http://down.coolaj.cn/bbshenqi'.$id.'.apk">生成失败,点击重试</a>';
			exit;
		}
		header('Location: http://down.coolaj.cn/bbshenqi'.$id.'.apk');
	}
 }

?>

阅读全文 ……

js倒计时

<SCRIPT LANGUAGE="JavaScript">   
<!--   
var maxtime = 60*60 //一个小时,按秒计算,自己调整!   
function CountDown(){   
if(maxtime>=0){   
minutes = Math.floor(maxtime/60); 
while(minutes>=60){
	minutes = Math.floor(minutes-60); 
}  
seconds = Math.floor(maxtime%60); 
hour = Math.floor(maxtime/3600);  
msg = "<span id='RemainD'>"+hour+"</span>小时<span>"+minutes+"</span>分钟<span>"+seconds+"</span>秒";   
document.all["timer"].innerHTML=msg;   
if(maxtime == 5*60) alert('注意,还有5分钟!');   
--maxtime;   
}   
else{   
clearInterval(timer);   
alert("时间到,结束!");   
}   
}   
timer = setInterval("CountDown()",1000);   
//-->   
</SCRIPT>   
<div id="timer" style="color:red"></div>

 

PHP生成随机字符串的方法

static function make_yqm($length = 5){
		// 密码字符集,可任意添加你需要的字符  
		$chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's','t', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D','E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O','P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!','@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_','[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',','.', ';', ':', '/', '?');  

		// 在 $chars 中随机取 $length 个数组元素键名  
		$keys =array_rand($chars, $length);
		$password = ''; 
		for($i=0;$i<$length;$i++){  
			// 将 $length 个数组元素连接成字符串  
			$password .= $chars[$keys[$i]];  
		}  
		return $password;
	}

 

在命令行执行PHP程序

一直把PHP当web端服务程序了,不知道他也是脚本,脚本啊,亲

配置说明

①. 添加php目录到系统环境变量path

②.

param1,param2,为参数。xxx.php文件可以接受传入的这两个参数,分别用$argv[1],$argv[2]接受传入的param1和param2.。

示例xxx.php:

<?php
for($i=$argv[1];$i<=$argv[2];$i++)
{
echo $i."\n";
}
?>

 

在命令行下运行:php xxx.php 1 10

则输出:1 2 3 4 5 6 7 8 9 10

您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用PDF文档解析 XML的任何事情。那你还知道可以用php的强大功能做点别的东西吗?在以独立的cgi方式运行时,需要一个php可执行程序,他有很多PHP命令行参数 的,有些可以用作很好玩的用途,下面是全部的PHP命令行参数,其中[]表示可有可无的,<>表是一定要的。

用法 php [-q] [-h] [-s] [-v] [-i] [-f ] | { [args…]} -q 安静模式。不输出HTTP头。

-s 将php程序文件用转化为彩色格式的HTML(比如保留字用绿色,函数和变量为蓝色,注释为黄色而字串则是红色等等。

-f 读入并解释指明的文件。

-c 在中读入php.ini文件

-a 交互式运行

-d foo[=bar] 定义ini中的输入项 foo 的值为 bar

-e 输出额外信息以便调试和性能分析

-z 调入Zend扩展文件

-i php的相关信息

-h help本身。

1.用php -q 文件名.php 方式把php程序当shell程序来用,

2.用 -s把自己的php程序html化。这样是不是很省心?

3.利用PHP命令行参数的odbc功能可以在shell命令中对数据库进行操作。

 

③一个读取数据并插入到数据库的例子

<?php
$Host = "localhost";
$Database = "test";
$DbaUser     = "root";
$DbaPassword = "";
$db = mysql_pconnect($Host, $DbaUser,$DbaPassword);
mysql_set_charset('utf8', $db); 
if(!$db){
	echo "我擦,数据库崩溃了~";
	exit;
}
mysql_select_db($Database,$db);
/*while($res = mysql_fetch_array($result)){var_dump($res);}*/
$handle = @fopen("F:/wamp/www/bb/ok_all0525.txt", "r");
if ($handle) {
	while (!feof($handle)) {
		$str = fgets($handle, 4096);
		$arr = explode(",",$str);
		$qq = explode("@",$arr[0]);
		$query = "INSERT INTO `qq` (`qq`,`b1`,`b2`,`b3`) VALUES ('{$qq[0]}','{$arr[1]}','{$arr[2]}','{$arr[3]}')";
		$result = mysql_query($query);
		var_dump($qq[0].$result);
	}
	echo 'ok';
}

mysql_close($db);
?>

 

 

页面防注入、跨站等等过滤代码

1.将waf.php传到要包含的文件的目录

2.在页面中加入防护,有两种做法,根据情况二选一即可:

a).在所需要防护的页面加入代码
require_once(‘waf.php’);
就可以做到页面防注入、跨站
如果想整站防注,就在网站的一个公用文件中,如数据库链接文件config.inc.php中!
添加require_once(‘waf.php’);来调用本代码

常用php系统添加文件
PHPCMS V9 \phpcms\base.php
PHPWIND8.7 \data\sql_config.php
DEDECMS5.7 \data\common.inc.php
DiscuzX2 \config\config_global.php
Wordpress \wp-config.php
Metinfo \include\head.php

b).在每个文件最前加上代码
在php.ini中找到:
Automatically add files before or after any PHP document.
auto_prepend_file = waf.php路径;

代码如下:

<?php
/*云体检通用漏洞防护补丁v1.0
更新时间:2013-04-25
功能说明:防护XSS,SQL,代码执行,文件包含等多种高危漏洞
*/
$url_arr=array(
'xss'=>"\=\+\/v(8|9|\+|\/)|%0acontent\-(id|location|type|transfer\-encoding)",
);
$args_arr=array(
	'xss' =>"[\'\"\;\*\<\>]+.*\b(on)[a-zA-Z]{3,15}[\s\r\n\v\f]*\=|\b(expression)\(|<script[\s\\\\\/]*.*>|(<!\[cdata\[)|\b(eval|alert|prompt|msgbox)\s*\(|url\((\#|data|javascript)",
	'sql' =>"([^{\s]{1}.+(select|update|insert((\/\*[\S\s]*?\*\/)|(\s)|(\+))+into).+?(from|set)((\/\*[\S\s]*?\*\/)|(\s)|(\+))+)|[^{\s]{1}.+(create|delete|drop|truncate|rename|desc)((\/\*[\S\s]*?\*\/)|(\s)|(\+))+(table|from|database)((\/\*[\S\s]*?\*\/)|(\s)|(\+))|(into((\/\*[\S\s]*?\*\/)|\s|\+)+(dump|out)file\b)|\bsleep\((\s*)(\d*)(\s*)\)|benchmark\(([^\,]*)\,([^\,]*)\)|\b(declare|set|select)\b.*@|union\b.*(select|all)\b|(select|update|insert|create|delete|drop|grant|truncate|rename|exec|desc|from|table|database|set|where)\b.*((charset|ascii|bin|char|uncompress|concat|concat_ws|conv|export_set|hex|instr|left|load_file|locate|mid|sub|substring|oct|reverse|right|unhex)\(|(master\.\.sysdatabases|msysaccessobjects|msysqueries|sysmodules|mysql\.db|sys\.database_name|information_schema\.|sysobjects|sp_makewebtask|xp_cmdshell|sp_oamethod|sp_addextendedproc|sp_oacreate|xp_regread|sys\.dbms_export_extension))",
	'other'=>"(..)[^&]*((%2500)|(%00))+[^0-9a-fA-F]|((%2500)|(%00))+[\'\"\.]+"
);
$referer=empty($_SERVER['HTTP_REFERER']) ? array() : array($_SERVER['HTTP_REFERER']);
$query_string=empty($_SERVER["QUERY_STRING"]) ? array() : array($_SERVER["QUERY_STRING"]);

check_data($query_string,$url_arr);
check_data($_GET,$args_arr);
check_data($_POST,$args_arr);
check_data($_COOKIE,$args_arr);
check_data($referer,$args_arr);
function W_log($log)
{
	$logpath=$_SERVER["DOCUMENT_ROOT"]."/log.txt";
	$log_f=fopen($logpath,"a+");
	fputs($log_f,$log."\r\n");
	fclose($log_f);
}
function check_data($arr,$v) {
 foreach($arr as $key=>$value)
 {
	if(!is_array($key))
	{ check($key,$v);}
	else
	{ check_data($key,$v);}

	if(!is_array($value))
	{ check($value,$v);}
	else
	{ check_data($value,$v);}
 }
}
function check($str,$v)
{
	foreach($v as $key=>$value)
	{
	if (preg_match("/".$value."/is",$str)==1||preg_match("/".$value."/is",urlencode($str))==1)
		{
			//W_log("<br>IP: ".$_SERVER["REMOTE_ADDR"]."<br>时间: ".strftime("%Y-%m-%d %H:%M:%S")."<br>页面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交数据: ".$str);
			print "您的提交带有不合法参数,谢谢合作";
			exit();
		}
	}
}
?>

 

IAP (内置购买) 服务器端代码

php的 curl 和  SSL (open_ssl)这两个模块开启

<?php
//服务器二次验证代码
function getReceiptData($receipt, $isSandbox = false)   
{   
	if ($isSandbox) {   
		$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';   
	}   
	else {   
		$endpoint = 'https://buy.itunes.apple.com/verifyReceipt';   
	}   

	$postData = json_encode(   
		array('receipt-data' => $receipt)   
	);   

	$ch = curl_init($endpoint);   
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);   
	curl_setopt($ch, CURLOPT_POST, true);   
	curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);   
	//这两行一定要加,不加会报SSL 错误
	curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);  
	curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); 

	$response = curl_exec($ch);   
	$errno    = curl_errno($ch);   
	$errmsg   = curl_error($ch);   
	curl_close($ch);   
	//判断时候出错,抛出异常
	if ($errno != 0) {   
		throw new Exception($errmsg, $errno);   
	}   

	$data = json_decode($response);   
	//判断返回的数据是否是对象
	if (!is_object($data)) {   
		throw new Exception('Invalid response data');   
	}   
	//判断购买时候成功
	if (!isset($data->status) || $data->status != 0) {   
		throw new Exception('Invalid receipt');   
	}   

	//返回产品的信息			
	return array(   
		'quantity'       =>  $data->receipt->quantity,   
		'product_id'     =>  $data->receipt->product_id,   
		'transaction_id' =>  $data->receipt->transaction_id,   
		'purchase_date'  =>  $data->receipt->purchase_date,   
		'app_item_id'    =>  $data->receipt->app_item_id,   
		'bid'            =>  $data->receipt->bid,   
		'bvrs'           =>  $data->receipt->bvrs   
	);   
}   

//获取 App 发送过来的数据,设置是否是沙盒状态
$receipt   = $_GET['data'];   
$isSandbox = true;   
//开始执行验证
try
 {
	 $info = getReceiptData($receipt, $isSandbox);   
	 // 通过product_id 来判断是下载哪个资源
	 switch($info['product_id']){
		case 'com.application.xxxxx.xxxx':
			Header("Location:xxxx.zip");
		break;			 
	}
 }
//捕获异常
catch(Exception $e)
{
	echo 'Message: ' .$e->getMessage();
}
?>

 

 

PHP知识总结

面向对象知识总结

 

1:如何写一个类

 

2:类的属性和方法的声明和调用(内部、外部)

 

3:构造函数与析构函数

 

4:继承  (继承是单继承,并且是单方向的继承)

如果一个属性或者方法被定义为private,则它不能被继承

使用parent关键字允许调用父类的方法。

 

 

5: 函数的重载

 

6:访问修饰符

 

类内部     类外部       子类中

public        yes        yes          yes

protected     yes        no           yes

private       yes        no           no

 

 

7:使用final关键字定义的类,禁止继承。

使用final关键字定义的方法,禁止重载。

 

 

8: 接口,php不能多继承,但是可以通过实现多个接口来弥补。

接口中只能包含未实现的成员方法,接口内不能包含任何成员属性。

 

9:  php4中对象是按照值传递的,而到了php5,对象是按照引用传递的。这样就大大的提高的效率

 

10: 使用 const 关键字来定义常量。

 

在类的内部通过 self::常量名

类的外部通过   类名::常量名,来访问

 

11:使用 static 关键字来定义一个静态的方法,静态方法可以通过 类名::方法名来访问

注意:在一个静态的方法中,不能使用this关键字,因为可能会没有可以引用的对象实例。

父类中的静态方法,如果要在子类中重载,那子类中的该方法必须也是静态的方法。

 

12:静态属性、静态方法、常量 在类的内部调用统一使用 self::要调用的 

在类的外部使用  类名::要调用的

 

13instanceof 关键字可以检查类的类型和类型提示。

可以检查一个对象是否是特定类的实例,是否是从某个类继承过来或者是否实现了某个类。

 

14:单继承但是可以实现多个接口。书写格式例如: class man extends person implements ps,hello

 

15: clone 关键字来克隆(复制)一个对象。

php5中的对象都是按照引用传递的,如果单纯的通过赋值的方式传递 ($p2 = $p ,

其实这是一种引用传值,如果要实现拷贝一个对象的功能,就必须通过clone来实现。

 

16abstract 关键字来定义个一个抽象类或者抽象方法。抽象类不能被实例化。

 

17:接口和抽象类的区分

(1)抽象类只允许单继承,而接口可以多实现

(2)抽象类中可以有成员属性和成员方法,而接口中只能有未实现的方法。

阅读全文 ……

php中文验证码

<?php
// Set the content-type
header("Content-type: image/jpeg");

// Create the image
$im = imagecreatetruecolor(400, 300);

// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
imagefilledrectangle($im, 0, 0, 399, 299, $white);

// The text to draw
$a=array('是','个','大','帅','哥','的','家','吕','朴','作','者');
$tmp=array_rand($a,4);

$text =$a[$tmp[0]].$a[$tmp[1]].$a[$tmp[2]].$a[$tmp[3]];// '中文';
// Replace path by your own font path
$font = 'simhei.ttf';
//$text=iconv('gb2312','utf-8','面对对象');

// Add some shadow to the text
imagettftext($im, 20, 30, 21, 200, $grey ,$font,$a[$tmp[0]]);
imagettftext($im, 20, -30, 61, 200, $grey,$font, $a[$tmp[1]]);
imagettftext($im, 20, 30, 101, 200, $grey, $font,$a[$tmp[2]]);
imagettftext($im, 20, -30, 141, 200, $grey, $font,$a[$tmp[3]]);

// Using imagepng() results in clearer text compared with imagejpeg()
imagejpeg($im);
imagedestroy($im);
?>