• PHP基础学习


    ·概述:

        学习PHP的目的是为了扩展服务器端开发能力。而且通过学习web端服务器开发也可以算是很好的学习。

        感觉语言的学习都是这样的过程:基础知识、高级特性、标准库学习和扩展库的学习。而最好的学习方法是多动手多写代码啦。

        基础知识有:注释和说明、变量和常量、类型系统、操作符系统、流程控制、文件读写、数组说明、字符串操作和正则表达式、函数系统、面向对象功能和错误异常控制。

        最后谈谈对PHP的感受:在语法方面PHP借鉴了很多C++元素,所以学习起来还算好了,最起码比看erlang强太多了。在就是对PHP的工作原理的理解:因为原先写过简单的服务器,感觉apache/nginx负责了所有的底层工作比如网络、同步等问题,而PHP则是专门处理逻辑处理部分。这样的话,感觉比我原先写服务器轻松多了--可能两个工作的侧重点不同吧。

    ·要点:

    --注释和说明:

        文件后缀一般是.php或.inc(include的缩写)。

        php可以嵌入到HTML中,标记风格有:

                <?php … ?>(xml风格--推荐使用);

                <? … ?>(简短风格);

                <script language= 'php'>. . .</script>(SCRIPT风格);

                <% … %>(ASP风格)。

        对空格的处理:同HTML一样PHP也忽略空格字符--回车、空格、Tab。

        注释:

             单行://和#。

             多行:/* … */方式。

        php的语句跟C++一样也是以;作为结束标记。

        访问表单变量的方法:

             简短风格—$tireqty,方便需要服务器配置,不推荐。

             中等风格—$_POST['tireqty'],推荐使用。

             冗长风格—$HTTP_POST_VARS['tireqty'],已弃用。

        echo用于回显输出;

        字符串连接操作符是点(.)。

        其中字符串表示的单引号和双引号是不同的:单引号表示文本含义即不做处理的输出(极个别的转移),而双引号会处理字符串--处理转移等。

    --变量和常量:

        标识符--跟C++的命名一样:

            长度不限但不建议太长;

            由字母、数字和下划线组成,但不能以数字开始;

            区分大小写,但函数名不区分大小写;

            变量名可与函数名同名--强烈不推荐。

        变量名的格式如$arge,需要$前缀。

        常量的定义: define('TIREPRICE',100);(推荐字符全大写)

        可以使用可变变量: $a='feng',$$a等价于$feng。

        变量的作用域:

             超级全局变量:比如$_POST等在整个脚本可见;

             常量也是全脚本可见的;

             脚本中定义的变量是脚本可见的,但函数内不可见;

             函数内定义的变量是本地的,函数外不可见;

             可通过关键字global定义在函数内外都可见的全局变量;

        常用的超级全局变量有:

             $GLOBALS,所有全局变量数组;

             $_SERVER,服务器环境变量数组;

             $_GET,通过GET方法传递给脚本的变量数组;

             $_POST,通过POST方法传递给脚本的变量数组;

             $_COOKIE,cookie变量数组;

             $_FILES,与文件上传相关的变量数组;

             $_ENV,环境变量;

             $_REQUEST,所有用户输入的变量数组,包括$_GET,$_POST,_COOKIE.

             $_SESSION,回话变量数组。

    --类型系统:

        支持的类型有:整数、浮点数、字符串、布尔值、数组和对象。

        支持的特殊类型有:NULL(表示未赋值等)和resource(一种在函数间传递的数据结构,比如说打开的文件、数据库的连接等)。

        类型之间的转换是使用的C风格$a=(float)10。

        同时可以使用内置的函数来进行类型转换。

        对于字符串:有单引号风格和双引号风格。字符串有相应的操作函数和操作符。

        内置对类型支持函数:

             gettype()和settype()可测试和设置变量类型;

                    相关判断还有is_*()系列函数;

             isset()--测试是否定义和unset()--删除变量;

             变量转换:intval(),floatval(),strval()。

    --操作符系统:

        算术操作符:加(+)减(-)乘(*)除(/)和取余(%);

        字符串操作符:点操作符(.);

        赋值操作符:=和混合赋值操作符(+=,-=,*=,/=,%=和.=);

        递增和递减操作符:与C++是一样的有前缀形式和后缀形式;

        引用语法:在变量前使用地址符(&);

        比较操作符:相比C++(==,!=,<,<=,>,>=)增加(===,!==,<>);

        逻辑操作符:符号(!,&&,||)和字符形式(and,or,xor);

        位操作符:&,|,~,^,<<,>>(不常用);

        其他操作符:

             三元操作符:形式是 condition ? true : false;

             错误抑制操作符:在语句前使用@符号;

             执行操作符(执行终端命令): 使用符号反单引号--在键盘上1旁边;

             数组操作符:使用符号[];

             类型操作符:使用instanceof来操作;

        操作符的优先级和结合性跟C++类似。

    --流程控制:

    条件:

        if语句形式:if(cond){}elseif(cond){}else{};

        switch语句,跟C++相同;

    循环:

        while,for和do…while跟C++是一样的;

        对数组还提供了foreach循环语句的支持;

    跳出:

        除了break,continue外还增加了exit--推出脚本;

    可替换形式:

        不实用花括号而使用字符,如if(cond) … endif形式;

         使用可替换形式的有:if,switch,while,for和foreach;

    使用declare:

         不常用,但其中的ticks需要学习使用;

    --文件读写:

    常用函数:

        打开文件:fopen(),其中可选择打开文件模式;

        关闭文件:fclose()函数;

        读文件:fread(),file_get_contents(),fgets(),fgetss(),fgetcsv(),

                   readfile(),fpassthru()和file(),fgetc();

        写文件:fwrite(),file_put_contents();

        删除文件:unlink();

    控制函数:

        文件状态判断:feof(),file_exists(),filesize()

        锁定文件:flock();

        文件读写指针操作:rewind(),fseek()和ftell();

    --数组说明:

        跟C++中的数组概念不同,有点向Python中的字典类似;

    数字索引数组:  

        数字索引是从0开始的,定义形式是使用array()形式;

        自动生成数组的函数有range();

        可使用foreach()来循环遍历数组--数字索引和非数字索引同样使用;

        foreach()的语法是foreach($array as $key => $value);

        数组操作符:+,==,===,!=,<>,!==;

        可以定义多维数组;

    数组排序函数:

        支持函数sort(),asort(),ksort(),rsort(),arsort()和krsort();

        多位数组usort()需要用户定义比较函数并作为参数;

        对数组的随机排序:shuffle()函数;

        将数组反序操作:array_reverse()函数;

    函数file()可直接返回文本数组,之后可直接对文本数组进行操作;

    其他数组操作:

        数组浏览:each(),current(),reset(),end(),next(),pos()和prev();

        可对数组中的每个元素都执行特定函数:array_walk();

        数组统计:count(),sizeof()和array_count_values();

        数组转换成标量:extract()函数;

    对于非数字索引的解释:

        首先要在定义上不同,其次是在访问方式不同导致的遍历方法的不同;

        同时其他的数组函数还是适用的;

    --字符串和正则表达式:

    字符串函数:

        格式化:rtrim(),ltrim(),trim(),nl2br(),printf(),sprintf(),vsprintf(),

                  strtoupper(),strtolower(),ucfirst(),ucwords(),

                  addslashes(),stripslashes();

        连接和分割:explode(),implode(),join(),strtok(),substr();

        比较:strcmp(),strcasecmp(),strnatcmp(),strlen();

        匹配和替换:strstr(),strchr(),strrchr(),stristr(),strpos(),strrpos(),

                        str_replace(),substr_replace();

    正则表达式:

        待定;

    --函数系统:

    引入文件:

        可使用require()和include()函数来引入文件;

        变体函数require_once()和include_once()--确保只引入一次;

        使用服务器配置auto_prepend_file和auto_append_file配置页眉和脚注;

    使用函数:

        函数调用方式与C++等其他语言调用方式一样--指非成员函数;

        调用未定义的函数会得到错误信息;

        函数名是不区分大小写的;

        同时要注意的是函数名没有$前缀;

    自定义函数:

        定义函数语法:function func_name($arg1,$arg2){…}形式;

        参数也分为传值(默认)和传引用(加前缀&且符合引用语义)两种方式;

        返回值用renturn语句;

        可以使用递归,但从性能上考虑不建议使用;

    命名空间问题:

        php中可以使用命名空间--待深入学习;

    --面向对象:

    类与对象:

        类定义方式:class classname{…}形式;

        访问控制符有public(默认),protected和private;

        类的实例化(对象)方法:$a=new classname(参数)的形式;

        构造函数(__construct())和析构函数(__destruct())形式;

        可以使用$this指针--表示对象本身;

        可以定义__get()和__set()两个函数--访问器和设置器;

        类属性和方法的访问符号是箭头符号(->);

    继承:

        继承形式为使用关键字"extends"来指明继承;

        不支持多重继承,可通过接口来实现多重继承的效果;

        可通过final关键字禁止继承和重载--类和方法都适用;

    重载--父类与子类的重载:

        在子类中定义与父类同名的函数将重载父类函数;

        成员函数的调用看调用对象的类型调用相应的对象;

        调用父类对象的方法是使用parent::形式--但需要注意的是虽然调用的是

            函数但父类函数内如果也调用重载成员的话会优先子类成员--与C++不同;

    接口:

        接口定义方式:interface InfName{…}形式;

        实现接口需要使用关键字"implements"形式;

    高级功能:

        使用pre-Class常量(静态数据成员):class Math{const pi=3.14159}形式;

        静态方法使用关键字"static",且通过符号"::"调用,而且没有$this关键字;

        可通过instanceof检查对象的类型;

        支持延迟静态绑定--待深入(没用过);

        通过关键字$a= clone $b来复制对象;

             而且在类中通过__clone()来定义复制函数--因为引用成员的需要;

        抽象类定义方法是:抽象方法和抽象类--都加前缀"abstract";

        可通过__call()来提供类方法的重载--同一个类中的重载;

    独立函数__autoload():

        将在实例化一个还没被声明的类时自动调用;

        主要用途是尝试包含或请求任何用来初始化所需类的文件;

    迭代器和迭代:

        要实现迭代器,需要实现IteratorAggregate接口并定义getIterator();

        需要实现复杂的行为要实现Iterator接口;

    类转化为字符串:

        使用__toString()函数实现;

    使用Reflection(反射) API:

        反射技术应该是从实例反推类结构吧;

        API接口是$class=new ReflectionClass("empl");

    --错误和异常:

    异常:

        异常机制是try{…}catch(…){…}和throw形式;

        PHP为异常提供了内置的类—Exception;

    自定义异常:

        可自定义继承Exception来定义自己的异常;

    其他错误处理机制:

        除了异常处理机制外,PHP还提供了复杂的错误处理支持--待深入学习;

    ·小结:

        基础部分完成;可以继续深入了。

  • 相关阅读:
    fdfs上传图片成功在浏览器中访问不到404 Not Found
    G1 GC日志:Application time: 0.8766273 seconds
    nginx编译问题:make[1]: *** [/usr/local/pcre//Makefile] Error 127
    Datatable报错Uncaught TypeError: Cannot read property 'cell' of undefined
    信息: Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level
    [HDU1176]免费馅饼(DP)
    [程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)
    [程序员代码面试指南]二叉树问题-在二叉树中找到累加和为指定值的最长路径长度
    [程序员代码面试指南]数组和矩阵-求最短通路值(BFS)
    [程序员代码面试指南]9-判断点在三角形内
  • 原文地址:https://www.cnblogs.com/davidyang2415/p/2438619.html
Copyright © 2020-2023  润新知