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的内容。

  因为当你在浏览器中输入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; 
    }
}

 

posted @ 2013-03-06 20:43  洒洒  阅读(408)  评论(0编辑  收藏  举报