您的位置:首页 > 编程语言 > PHP开发

PHP知识点积累

2013-03-06 20:43 239 查看
  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();


[b]11.根据ip地址获取对应的地区[/b]

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 '未知';
}
}


[b]12.异常try{}catch{}[/b]: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的内容。

  因为当你在浏览器中输入url回车时,就是在做这个事情,当然浏览器要做的更多。


  整个代码的原理:

  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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: