zoukankan      html  css  js  c++  java
  • 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; 
        }
    }
  • 相关阅读:
    paper 113:Bhattacharyya distance
    (ZT)算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
    (ZT)算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
    (ZT)算法杂货铺——分类算法之决策树(Decision tree)
    (ZT)算法杂货铺——k均值聚类(K-means)
    超详细的遗传算法(Genetic Algorithm)解析
    Ontology理论研究和应用建模
    观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别
    程序员常用字体(vs2008字体修改方案)
    雾计算和边缘计算的区别
  • 原文地址:https://www.cnblogs.com/thinksasa/p/2946895.html
Copyright © 2011-2022 走看看