PHP知识点积累
1.构造函数的作用:就是在你用new创建那个class的时候,class里的构造函数就自动执行了,不需要你再去调用,用途一般是做配置类初始化信息,比如加个类全局变量什么的,构造函数只是创建类的实例的时候自动被调用。其他地方也跟普通函数一样。
2.析构函数(destructor):与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
构造函数与析构函数一起用的例子:
<?php class conn{ public $hostname; public $username; public $userpwd; public $conn; public function __construct($x,$y,$z){ //应用构造函数对类体中的属性进行初始化 $this->hostname=$x; $this->username=$y; $this->userpwd=$z; } public function getConn(){ //建立与数据库的连接 $this->conn=mysql_query($this->hostname,$this->username, $this->userpwd); return $this->conn; } public function __destruct(){ //应用析构函数自动释放连接资源 mysql_close($this->conn); } } ?>
3.$this是指类本身, $this->base() 指调用当前类中的base()方法。
4.静态方法是可以不用实例化对象,在所有的地方访问,比较公开,如果设置成pulbic,就必须实例化,如果是private,就只能只对象内部访问
5.表单中比较特殊的就是复选框和图像域了
复选框的话,因为要名称都一样,所以前端得定义成同名的数组,后面取的时候用POST取值
图片域的话,那么就得表单必须用POST方式提交,且要加一个 enctype="multipart/form-data" 属性,后面取的时候用 $_FILES取值
6.PHP isset():isset函数是检测变量是否设置。
格式:bool isset ( mixed var [, mixed var [, ...]] )
返回值:
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数。
***警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。
<?php $a = array ('test' => 1, 'hello' => NULL); var_dump(isset($a['test'])); // TRUE var_dump(isset($a['foo'])); // FALSE var_dump(isset($a['hello'])); // FALSE // 'hello' 等于 NULL,所以被认为是未赋值的。 // 如果想检测 NULL 键值,可以试试下边的方法。 var_dump( array_key_exists('hello', $a) ); // TRUE ?>
7.file_put_contents(file,data,mode,context) 函数把一个字符串写入文件中。与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
file:必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
8.error_reporting() 设置 PHP 的报错级别并返回当前级别。
<?php //禁用错误报告 error_reporting(0); //报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL); ?>
9.关于if(strpos($str,'#')){...}函数中,'#'在字符串$str首位置的时候的处理问题:必须用恒等于'===0'判断
函数strpos()定义:strpos() 函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false。
$str = "#aldk"; if(strpos($str,'#')===0){ echo "找到了"; }else{ echo "没找到"; }
1)必须是以上写法才对,因为当'#'位于字符串$str首位置的时候,返回0,用'==='表示数据类型和值都相等;
2)如果用'===',那恒等于后不能用'0';
3)如果用'==0',判断会出错,比如:当在字符串$str找不到搜索的字符,会返回false,这是false会转换成0,也就造成(false==0)为true。但是如果用(false===0)的恒等式,则返回false。
10.PHP的抽象类和接口
<?php /** * 抽象类 * 1.abstract关键字声明抽象类名和抽象方法名; * 2.抽象类中至少有一个抽象方法; * 3.子类必须实现抽象类中的所有抽象方法; * 4.子类中的参数数量必须和抽象类的函数中的参数"一致"(可选参数可以无视); */ abstract class teacher{ public function teach($name){ echo $name."the teacher is teaching..."; } abstract public function say($content); } class goodTeacher extends teacher{ public function say($content){ echo $content; } public function saygood($good){ echo "good teacher can say ".$good; } } $p = new goodTeacher(); $p->saygood("good"); /** * 接口 * 1.interface关键字声明接口; * 2.接口中所有的方法没有方法体; * 3.子类必须实现接口的所有抽象方法; * 4.子类中的参数数量必须和接口函数中的参数"一致"(可选参数可以无视); */ interface animate{ public function run(); public function fly(); } class birds implements animate{ function run(){ echo "run.."; } function fly(){ echo "fly..."; } } $m = new birds(); $m->fly();
11.根据ip地址获取对应的地区
public static function address($ip) { $info = json_decode(file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip='.$ip.'&format=json'), false); if ($info ->ret == 1) { if ($info ->province != $info ->city) { return $info ->country.",".$info ->province; } else { return $info ->country.",".$info ->province; } } else { return '未知'; } }
12.异常try{}catch{}:PHP中必须先手动抛出异常,然后才能捕获异常(因为PHP是后来才加入异常的,而之前的很多基础类库并没有做抛出异常异常,所以需要手动抛出)。
<?php function test($a){ if($a<5){ throw new Exception('error ...........'); } } try { test(3); } catch(Exception $e) { echo $e->getMessage(); } ?>
13.加号和merge的区别:
加号:数字索引、字符串索引相同,则不覆盖;不同则追加;
merge:
1.如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值;
2.如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面;
3.如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
14.gzdecode函数需要zlib模块支持,如果没有zlip模块,我们可以自定义一个函数,去实现。
if (!function_exists('gzdecode')) { function gzdecode ($data) { $flags = ord(substr($data, 3, 1)); $headerlen = 10; $extralen = 0; $filenamelen = 0; if ($flags & 4) { $extralen = unpack('v' ,substr($data, 10, 2)); $extralen = $extralen[1]; $headerlen += 2 + $extralen; } if ($flags & 8) // Filename $headerlen = strpos($data, chr(0), $headerlen) + 1; if ($flags & 16) // Comment $headerlen = strpos($data, chr(0), $headerlen) + 1; if ($flags & 2) // CRC at end of file $headerlen += 2; $unpacked = @gzinflate(substr($data, $headerlen)); if ($unpacked === FALSE) $unpacked = $data; return $unpacked; }}
15.POST带参数请求
$rjson = ""; $host = "10.10.100.xx"; $url = "/mpapp/sysDataDicItem"; $port = "8090"; $method = "POST"; $post_str = "selectType=app_version"; $content_length = strlen($post_str); $fp = fsockopen($host,$port,$errno,$errstr,30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "$method $url HTTP/1.1\r\n"; $out .= "Host: ".$host."\r\n"; $out .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n"; $out .= "Accept-Language: zh-cn;\r\n"; //没有该行,则不返回数据 $out .= "Content-type: application/x-www-form-urlencoded\r\n"; $out .= "Content-Length: $content_length\r\n"; $out .= "Connection: close\r\n\r\n"; $out .= $post_str."\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { $rjson .= fgets($fp, 512); } fclose($fp); } //截取头信息 $subRjson = mb_substr($rjson, 255); $infRjson = gzdecode($subRjson);
<?php
$fp = fsockopen("mingjuli.com",80,$errno,$errstr,5);
fwrite($fp,"GET /1.txt HTTP/1.1\r\nHost:mingjuli.com\r\nConnection:Close\r\n\r\n");
?>
这段代码可以实现模拟http请求。
1.fsockopen函数打开socket连接;
2.fwrite函数把GET请求字符串写入文件指针$fp里,即可请求到1.txt这个文件。(这里的原理是:
运行-cmd-telnet 192.168.1.234 80(端口80前不要冒号)-GET /1.txt
按Enter键后就出现了1.txt的内容。
)
整个代码的原理:
fsocketopen 是直接建立和访问tcp连接的方式,建立后可以用相关协议去访问,比如redis memcache http ftp 等等,输入是用php输出函数实现的fwrite。
当获取到请求的页面后会自动断开telnet连接是因为:主机在传输完所有的数据后会关闭连接,所以telnet 会显示断开连接。
利用fsocket模拟GET和POST请求:
<?php
// fsocket模拟get提交
$gurl = "http://localhost/php/t.php?uu=gggggg";
echo "以下是GET方式的响应内容:<br>";
sock_get ( $gurl );
function sock_get($url) {
$info = parse_url ( $url );
$fp = fsockopen ( $info ["host"], 80, $errno, $errstr, 3 );
$head = "GET " . $info ['path'] . "?" . $info ["query"] . " HTTP/1.0\r\n";
$head .= "Host: " . $info ['host'] . "\r\n";
$head .= "\r\n";
$write = fputs ( $fp, $head );
while ( ! feof ( $fp ) ) {
$line = fgets ( $fp );
echo $line . "<br>";
}
}
// fsocket模拟post提交
$purl = "http://localhost/php/t.php";
echo "以下是POST方式的响应内容:<br>";
sock_post ( $purl, "uu=rrrrrrrrrrrr&&kk=mmmmmm" );
function sock_post($url, $query) {
$info = parse_url ( $url );
$fp = fsockopen ( $info ["host"], 80, $errno, $errstr, 3 );
$head = "POST " . $info ['path'] . " HTTP/1.0\r\n";
$head .= "Host: " . $info ['host'] . "\r\n";
$head .= "Referer: http://" . $info ['host'] . $info ['path'] . "\r\n";
$head .= "Content-type: application/x-www-form-urlencoded\r\n";
$head .= "Content-Length: " . strlen ( trim ( $query ) ) . "\r\n";
$head .= "\r\n";
$head .= trim ( $query );
$write = fputs ( $fp, $head );
while ( ! feof ( $fp ) ) {
$line = fgets ( $fp );
echo $line . "<br>";
}
}
?>
<?php
//请求的响应页面t.php
if (isset ( $_GET ['uu'] )) {
echo '<font color="red">t.php中$_GET["uu"]的值是:' . $_GET ['uu'] . "</font><br>";
}
if (isset ( $_POST ['uu'] )) {
echo '<font color="red">t.php中$_POST的值是:</font><br>';
print_r ( $_POST );
}
?>
curl http post请求
function httpPost($host,$url) { $url = "http://app.9888.cn/sysDataDicItem/dicItemList"; //$url = "http://10.10.100.40:8090/mpapp/sysDataDicItem/dicItemList"; $data = 'selectType=app_version'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt ( $ch, CURLOPT_POST, TRUE ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_TIMEOUT, 120); $result = curl_exec($ch); if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') { $infRjson = gzdecode($result); $resultStr = json_decode($infRjson,true); return $resultStr; } curl_close ( $ch ); return NULL; }
16.路径问题:
__FILE__:该常量在哪个文件,输出的就是哪个文件的路径。
17.PHP的一些有用的常量
PHP_OS
18.获取头信息
if(!function_exists('getallheaders')){ function getallheaders() { foreach($_SERVER as $k=>$v) { if(strncmp($k, 'HTTP_', 5) == 0) { $k = strtolower(substr($k, 5)); $k = join('_', array_map('ucfirst', explode('_', $k))); $res[$k] = $v; } } return $res; } }