PHP基础注意点

is_callable和method_exists

is_callable: 用来判断对应类的方法当前有没有权限使用,同时存不存在
method_exists: 仅仅能判断当前方法存不存在

  • is_callable比method_exists慢
class Test{
    public function pubFun(){}
    private function priFun(){}
}
class Index{
    private function array_sort(){}
    public function index(){
        $model = new Test();
        var_dump(is_callable([$model,'pubFun']));//true,方法存在
        var_dump(is_callable([$model,'priFun']));//false,方法不可调用
        var_dump(is_callable([$model,'unFun']));//false,方法不存在
        var_dump(is_callable([$this,'array_sort']));//true,方法可调用

        var_dump(method_exists($model,'pubFun'));//true,方法存在
        var_dump(method_exists($model,'priFun'));//true,方法存在
    }
}

foreach和while和for

  • foreach访问数组元素性能是最优的方法 —出自[PHP与MySQL高性能应用开发]

isset

false:没有定义或为null

var_dump(isset($a));//false
$a = null;
var_dump(isset($a));//false
$a = '';
var_dump(isset($a));//true

empty

一维的空数组返回true,空格返回false

var_dump( empty( array() ) );//true
var_dump( empty( array( arrya() ) ) );//false
var_dump( empty( ' ' ) );//false

静态变量

函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)
这里写图片描述

PHP之static静态变量详解(一) - 52php - 博客园

继承

abstract class ParentClass{
    public $a = '1';
    protected $b = '2';
    private $c = '3';
    public $d = '4';
    protected $parent = 'parnet';
    public function test(){
        echo __CLASS__.' '.__FUNCTION__.PHP_EOL;
    }
    public function test2(){
        echo __CLASS__.' '.__FUNCTION__.PHP_EOL;
    }
    public function test3(){
        echo __CLASS__.' '.__FUNCTION__.PHP_EOL;
    }
    private function test4(){
        echo __CLASS__.' '.__FUNCTION__.PHP_EOL;
    }
}

class ChildClass extends ParentClass{
    public $a = 'a';
    protected $b = 'b';
    public $c = 'c';
     //报错
    //private $d = 'd';
    public function test(){
        echo __CLASS__.' '.__FUNCTION__.PHP_EOL;
    }
    //报错,不能比父类定义的权限低
    /* protected function test3(){
        echo __CLASS__.' '.__FUNCTION__.PHP_EOL;
    } */

    //可以比父类的权限大或相等
    protected function test4(){
        echo __CLASS__.' '.__FUNCTION__.PHP_EOL;
    }
    /* public function test2($var){
        echo __CLASS__.' '.__FUNCTION__.' '.$var.PHP_EOL;
    } */
    public function getB(){
        echo $this->b.PHP_EOL;
    }
    public function getC(){
        echo $this->c.PHP_EOL;
    }
    public function getParent(){
        echo $this->parent.PHP_EOL;
    }
}

//报错抽象方法不能实例化Cannot instantiate abstract class ParentClass
//$parent = new ParentClass();
//var_dump($parent);

$childClass = new ChildClass();
echo $childClass->a.PHP_EOL;
$childClass->test();//ChildClass test

//不能和父类参数不一致Declaration of ChildClass::test2($var) should be compatible with ParentClass::test2()
//$childClass->test2('from child');
$childClass->getB();//b
$childClass->getC();//c
$childClass->getParent();//parnet
abstract class ParentClass{}
class ChildClass extends ParentClass{}
class ChildClass2 extends ParentClass{}

$childClass = new ChildClass();
var_dump($childClass instanceof ParentClass);//true
var_dump($childClass instanceof ChildClass2);//false

结论
1.子类的方法和属性权限必须>=父类
2.子类的方法参数个数必须和父类一样
3.子类可以定义
4.抽象类不能实例化
5.继承同一父类的两个子类进行instanceof 比较返回false

require 和require_once

出于效率考虑使用require.
require_once比require多加一个了过滤重复功能.效率肯定比较差点

读取小文件使用file_get_contents()代替fopen

读取小文件的时候使用file_get_contents()会将文件缓存到内存中–内存映射,能大幅提高性能.[高性能PHP应用开发]
我自己的测试结果是消耗时间和本身服务器状态有关,不一定每次都会file_get_contents比较快.这个我觉得可以记住,想到了就用不会有什么不好的

 $s = microtime(true);

        //消耗时间6.9362108707428   7.7130241394043
   /*     for ($i=0;$i<1000000;$i++){
            file_get_contents(APP_PATH.'/public/index.php');
        }
*/
        //消耗时间7.1278259754181   7.7949500083923
         for ($i=0;$i<1000000;$i++){
            $handle = fopen(APP_PATH.'/public/index.php', 'r');
            fwrite($handle, filesize(APP_PATH.'/public/index.php'));
        }
        $s2 = microtime(true);
        echo $s2-$s.PHP_EOL;

参考

PHP与MySQL高性能应用开发
高性能PHP应用开发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值