读书笔记:PHP和MySQL高性能应用开发 (2019.2.20-2019.3.4)

1.emtpy、isset、is_null的区别

  isset()检测一个变量是否已声明且值不为NULL,并且声名一个变量没有赋值也算false,但是空字符串或者空格为true
  empty()用来检测一个变量是否为空,当变量为空字符串、false、空数组、null、0、‘’以及被unset删除后的变量
  is_null()判断变量内容是否是null,是isset()函数的反函数,区别是isset()可以应用到未知变量,但是is_null只能针对已声名变量

2.超级全局数组

  PHP执行时会自动将当前脚本需要收集的数据分类保存在这些超级全局数组中

     $GLOBALS超级全局数组可以让我们在函数里访问全局变量

     例如

 <?php
 $globalName='全局变量';
 function say(){
 echo $GLOBALS['globalName'];
 }


 3.global关键字与global数组的区别
 $GLOBALS['var']是外部的全局变量本身
 global $var是外部$var的同名引用或者指针
 

<?php
$val=1;
function test(){
    //1、unset($GLOBALS['val']);
    global $val;
    unset($val);
}
test();
echo $val;


1.的时候$val变量被删除  
global $val 与&GLOBALS['val']等价,相当于调用外部变量的一个别名,所以上面代码中的$val和$GLOBALS['val']指的是同一个变量
注:php的全局变量和c有点不同,在c的全局变量在函数体内无效,而在php中,在函数中想要调用外部的全局变量可用global什么,php的
'全局'不是指整个网站,而是应用于当前页面,包括include或require的全部文件
结论:$GLOBALS['var']是外部的全局变量本身
      global $var是外部$var的同名引用或者指针

4.静态变量
  函数内的局部变量执行时存在,完毕后会在内存里直接删除,但是如果想在函数调用保存上次变量执行的结果,以便下次执行时使用,这时就用静态变量,当脚本运行完毕退出的时候,静态变量也会销毁,这一点和全局、局部变量特性相同
5.require_once要慢于require,使用autoload速度最快,在实际运营环境中,使用error_reporting(0)禁止所有的错误显示
6.匿名函数
 

<?php
$greet =function($name){
 echo "$name";    
};


array_map('函数',数组)   数组内的每个元素都将使用之前的函数遍历一遍
而在匿名函数中 array_map(function(value){},$names);
PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。
function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}
//输出:
//1
//报错,找不到dorllar变量
7.is_callable与method_exists函数  都是用来检查一个对象里的方法是否存在
  在method_exists(array(对象,'方法'))函数中判断一个私有或者保护方法,能够得到正确的返回,但是执行的时候会得到一个错误警告
  而is_callable(array(对象,'方法'))函数接受一个回调参数,如果在当前作用域可以执行就返回true
8.文件处理
$handle=fopen("/var/logs/somefile.txt",'r');
如果处理意见存在的文件,也不想删除它原来的内容:
  r : 只读。指针定位在文件的开头,如果文件不会报错。
  r+: 读/写。指针定位在文件的开头,如果文件不存会报错。
如果想新创建一个文件或代替现有文件:
  w : 只写。打开并清空文件的内容,如果文件不存在,则创建新文件。
  w+: 读/写。打开并清空文件的内容,如果文件不存在,则创建新文件。
php允许我们使用两种追加写入文件的模式:
  a-:追加模式,如果不存在,则尝试创建它
  a+:读/追加模式,游标置于文件尾部,将从文件末尾开始追加(写),如果该文件不存在,则创建它
谨慎的文件写操作:
  x : 只写。创建新文件。如果文件以存在,则返回 FALSE。
  x+ : 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
  大多数读取文件场景,都是读取文件的每一行后进行操作,这时就可以使用file()函数读取整个文件到一个数组中

  $lines=file('1.txt');
  foreach($lines as $line =>$l){
  echo "Line #{$line_num}:".$line."n";
  }


file()函数可选参数:
include_path    可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 null,则忽略。

file_get_contents(path,include_path,context,start,max_length)

可以接受这几个参数:start:规定在文件中开始读取的位置 max_length:可选。规定读取的字节数
file_get_contents 获取远程文件时会把结果都存在一个字符串中 fiels函数则会储存成数组形式,这个函数是一次性读取所有文件内容并显示出来,但是如果文件超大会导致php占很大的内存了。

注:下面给大家介绍下fopen()和file_get_contents()打开URL获得网页内容的用法区别
在php里,要想打开网页URL获得网页内容,比较常用的函数是fopen()和file_get_contents()。如果要求不苛刻,此两个函数多数情况下是可以根据个人爱好任意选择的,本文谈下此两函数的用法有什么区别,以及使用时需要注意的问题。
fopen()打开URL

下面是一个使用fopen()打开URL的例子:  

 <?php

    $fh = fopen('http://www.php.cn/', 'r');
    if($fh){
    while(!feof($fh)) {
    echo fgets($fh);

    }
    }
?>


从此例子可以看到,fopen()打开网页后,返回的$fh不是字符串,不能直输出的,还需要用到fgets()这个函数来获取字符串。fgets()函数是从文件指针中读取一行。文件指针必须是有效的,必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。
可知,fopen()返回的只是一个资源,如果打开失败,本函数返回 FALSE 。
file_get_contents()打开URL
下面是一个使用file_get_contents()打开URL的例子:

<?php

$fh= file_get_contents('http://www.php.cn/');

echo $fh;

?>


从此例子看到,file_get_contents()打开网页后,返回的$fh是一个字符串,可以直接输出的。
通过上面两个例子的对比,可以看出使用file_get_contents()打开URL,也许是更多人的选择,因为其比fopen()更简单便捷。
不过,如果是读取比较大的资源,则是用fopen()比较合适。

readfile()函数不像之前两个函数很方便抓取远端文件,这是直接的方式来获取缓冲区中的文件内容

<?php
$file="1.txt";
$bytesRead=readfile($file);
echo $bytesRead;

fgets()函数可以帮我们读取文件时从文件指针的位置开始读取一行,并作为一个字符串返回,也可以指定想让他读取的字节长度
例如:

$file="1.txt";
$hadle=fopen($file,"rt");
if($handle){
    while(!feof($handle)){ //检查是否到达文件末尾,如果指针到了EOF或者出错返回TRUE,否则返回一个错误(包括socket超时),其他false
          $buffer=$fets($handle,8192)//8kb
          echo $buffer;
    }
    fclose($handle);
}

fread()函数,主要是来安全读取二进制文件,它需要一个文件句柄和文件指针读取字节的长度
例如:安全读取二进制文件

$file='1.txt';
$handle=fopen($file,"r");
$contents=fread($handle,filesize($file));
fclose($handle);

例如:安全读取远端二进制文件

$hadle=fopen("http://www.2.com/1.gif","rt");
$contents='';
if($handle){
    while(!feof($handle)){  
    $contents=$contents.fread($handle,8192);
    }
    fclose($handle);
}

9.局部goto语句(无法跳出一个函数或类方法)

<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';
?>


输出 :Bar
10手册上的小瑕疵

echo "hollo".getInfo()."还有:".showInfo();
这段代码的执行过程:
 1>创建一个新的临时字符串
 2>把hollo加入字符串
 3>然后调用getInfo()函数返回的内容加入字符串
 4>创建一个新的临时字符串
 5>放入第一次创建的字符串
 6>把还有加入字符串
 7>调用showInfo()返回的内容加入字符串
 8>打印
优化:echo "hollo",getInfo(),"还有:",showInfo();

 

面向对象可实现的目标

                      容易在已有代码的基础上扩展,代码重构和扩展
                      允许类型微调,以在方法中对这些变量进行权限控制
                      结合设计模式,能够解决大多数软件设计的问题,扩展性好,调试更容易

虽然会损耗一些性能,但是面向对象的开发重要性在于封装,它将问题分割成小块,容易理清并易解决

1.构造方法:function_construct()和类名相同的方法 ,但是PHP虚拟机会先执行前一个
2.接口:接口就是一个空类,只包含方法的声明,任何类要实现接口,必须完成里面定义的所有方法
3.抽象类:当声明抽象方法的时候,意味着子类必须重写该方法,一个抽象的方法不包含任何内容
4.魔术方法: 
  1> __get() __set() __call()来存取类中没有定义的成员方法和属性
     当写入一个不存在或不可见的属性时,执行__set($name,$value)方法
     当调用一个不存在或者不可见的属性时,执行__set($name)方法
     当试图调用类中一个不存在或者不可见的方法,执行__call($method_name,$parameters)方法,接受两个参数,用来存放试图调用方法名称及参数
       (参数会被放在一个与该参数同名的数组中)
  2>__sleep()方法在序列化一个实例的时候被调用,必须返回一个数组或者对象(一般是返回的是当前对象$this),返回
        的值将会被用来做序列化的值,如果不返回这个值,则表示序列化失败,也意味着反序列化不会触发__wakeup()事件
    __wakeup()则是在反序列化的时候被调用

    $i=new 类;
    $si=serialize($i);
    unserizlize($i);
  3>__toString() 可以把类的实例转化为字符串,这个成员方法调用并打印当前类中构建器中的值,在这个结构中,调用了公共的字符串操作,这样的字符串连接也就形成了字符串
  4>__autoload() 当访问一个还未定义的类,这个方法开始将这个类名作为文件类参数来调用该类,如果能够成功引入该类,则顺利

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值