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; 

    }

}

 

你可能感兴趣的:(PHP)