首页> 搜索结果页
"说说PHP的autoLoad自动加载机制" 检索
共 5 条结果
说说PHP的autoLoad自动加载机制
说说PHP的autoLoad自动加载机制 作者: 字体:[增加 减小] 类型:转载   php的autoload大致可以使用两种方法:__autoload和spl方法。这两种方法又各有不同的几种使用方法   __autoload的使用方法1: 最经常使用的就是这种方法,根据类名,找出类文件,然后require_one  复制代码代码如下: function __autoload($class_name) { $path = str_replace('_', '/', $class_name); require_once $path . '.php'; } // 这里会自动加载Http/File/Interface.php 文件 $a = new Http_File_Interface();  这种方法的好处就是简单易使用。当然也有缺点,缺点就是将类名和文件路径强制做了约定,当修改文件结构的时候,就势必要修改类名。 __autoload的使用方法2(直接映射法)  复制代码代码如下: $map = array( 'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php' ); function __autoload($class_name) { if (isset($map[$class_name])) { require_once $map[$class_name]; } } // 这里会自动加载C:/PHP/HTTP/FILE/Interface.php 文件 $a = new Http_File_Interface();  这种方法的好处就是类名和文件路径只是用一个映射来维护,所以当文件结构改变的时候,不需要修改类名,只需要将映射中对应的项修改就好了。 这种方法相较于前面的方法缺点是当文件多了的时候这个映射维护起来非常麻烦,或许这时候你就会考虑使用json或者单独一个文件来进行维护了。或许你会想到使用一个框架来维护或者建立这么一个映射。 spl_autoload __autoload的最大缺陷是无法有多个autoload方法 好了, 想下下面的这个情景,你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了。解决的办法就是修改__autoload成为一个,这无疑是非常繁琐的。 因此我们急需使用一个autoload调用堆栈,这样spl的autoload系列函数就出现了。你可以使用spl_autoload_register注册多个自定义的autoload函数 如果你的PHP版本大于5.1的话,你就可以使用spl_autoload 先了解spl的几个函数: spl_autoload 是_autoload()的默认实现,它会去include_path中寻找$class_name(.php/.inc) Spl_autoload实现自动加载:  复制代码代码如下: /*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*test.php*/ <?php set_include_path("/home/yejianfeng/handcode/"); //这里需要将路径放入include spl_autoload("http"); //寻找/home/yejianfeng/handcode/http.php $a = new http(); $a->callname();  Spl_autoload_register 将函数注册到SPL __autoload函数栈中,直接看一个例子:  复制代码代码如下: /*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*test.php*/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once("/home/yejianfeng/handcode/http.php"); } }); $a = new http(); $a->callname();  spl_autoload_call 调用spl_autoload_register中注册的调用函数, 看下面的例子  复制代码代码如下: /*http.php*/ <?php class http { public function callname(){ echo "this is http"; } } /*http2.php*/ <?php class http { public function callname(){ echo "this is http2"; } } /*test.php*/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once("/home/yejianfeng/handcode/http.php"); } if($class == 'http2'){ require_once("/home/yejianfeng/handcode/http2.php"); } }); spl_auto_call('http2'); $a = new http(); $a->callname(); //这个时候会输出"this is http2"  spl_auto_register这个函数使得我们不使用__autoload,使用自定义的函数来进行自动加载成为可能。这个方法现在是经常使用到的。 Zend的AutoLoader模块就使用了这个方法。摘录其中对应的代码  复制代码代码如下: spl_autoload_register(array(__CLASS__, 'autoload')); public static function autoload($class) { ….. }  建议参考文章: 关于zend的autoload机制,前面有篇文章http://www.jb51.net/article/31399.htm 有详细分析。 关于autoload的自动加载机制,这篇文章http://www.jb51.net/article/31279.htm说得非常详细,从底层开始分析。
文章
PHP  ·  数据格式  ·  JSON
2015-04-14
PHP面试题大全
一 、PHP基础部分1、PHP语言的一大优势是跨平台,什么是跨平台?PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台2、WEB开发中数据提交方式有几种?有什么区别?百度使用哪种方式?Get与post两种方式区别:(1)url可见性:get 方式url参数可见,post 不可见(2)可缓存性:get 方式是可以缓存的,post 方式不可以缓存。(3)传输数据大小:get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大);post 请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。(4)数据传输上:get 方式通过url地址栏拼接参数进行传输,post 方式通过body体进行传输。建议:1、get式安全性较Post式要差些包含机密信息建议用Post数据提交式;2、做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式;百度使用的get方式,因为可以从它的URL中看出3、掌握PHP的哪些框架、模板引擎、系统等框架:框架有很多,例如CI、Yii、Laravel等等,咱们学过的是thinkphp模板引擎:也有很多,在课本中有,咱们学过的是smarty系统:有很多,例如:康盛的产品(uchome、supesite、discuzX等),帝国系统、DEDE(织梦)、ecshop等,咱们学过的是DEDECMS、Ecshop4、说一下你所掌握的网页前端技术有哪些?熟练掌握DIV+CSS网页布局,JavaScript,jQuery框架、photoshop图片处理5、AJAX的优势是什么?ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。6、安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?(1)使用验证码防止注册机灌水。(2)使用预处理,绑定参数,参数过滤转义 防止sql注入(3)使用token防止远程提交,使用token验证登录状态。7、在程序的开发中,如何提高程序的运行效率?(1)优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询。(2)数据表中创建索引。(3)对程序中经常用到的数据生成缓存(比如使用redis缓存数据,比如使用ob进行动态页面静态化等等)。(4)对mysql做主从复制,读写分离。(提高mysq执行效率和查询速度)(5)使用nginx做负载均衡。(将访问压力平均分配到多态服务器)8、PHP可否与其它的数据库搭配使用?PHP与MYSQL数据库是最优搭配,当然PHP也可以去其它的数据库搭配使用,例如PostgreSql,SqlServer,Oracle,SqlLite等。9、现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示。优点是:①可以实现代码的重用性,避免产生代码冗余;②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式10、对json数据格式的理解?JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,json数据格式固定,可以被多种语言用作数据的传递。PHP中处理json格式的函数为json_decode( string json [, booljson[,boolassoc ] ) ,接受一个 JSON格式的字符串并且把它转换为PHP变量,参数json待解码的json string格式的字符串。assoc当该参数为TRUE时,将返回array而非object;Json_encode:将PHP变量转换成json格式。11、Print、echo、print_r有什么区别?(1) echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。(2) print 是打印字符串(3)print_r 则是打印复合类型 如数组 对象12、SESSION与COOKIE的区别?(1)存储位置:session存储于服务器,cookie存储于浏览器(2)安全性:session安全性比cookie高(3)session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用13、PHP处理数组的常用函数?(重点看函数的‘参数’和‘返回值’)(1)array() 创建数组(2)in_array() 判断元素是否在数组中(3)count() 返回数组中元素的数目(4)array_merge() 将多个数组合并成一个数组(5)array_diff() 比较两个或两个以上数组的差异(6)array_intersect() 获取两个或两个数组以上的交集(7)array_keys() 获取数组的key列表(8)array_values() 获取数组的值列表(9)array_unique() 删除数组中的重复值(10)array_push()将一个或多个元素插入数组的末尾(入栈)(11)array_pop() 弹出并返回 array 数组的最后一个单元(出栈)(12)array_walk() 使用用户自定义函数对数组中的每个元素做回调处理14、PHP处理字符串的常用函数?(重点看函数的‘参数’和‘返回值’)(1)trim() 移除字符串两侧的空白字符和其他字符;(2)strlen() 获取字符串的长度(3)mb_strlen() 获取字符串长度(可指定字符编码,对中文字符串计算长度)(4)substr()返回字符串的一部分;(5)str_replace() 子字符串替换(6)str_repeat () 重复一个字符串(7)is_string() 检测变量是否是字符串;(8)str_shuffle () 随机打乱一个字符串(9)sprintf() 返回根据格式化字符串生成的字符串(通常用于获取分表后的数据表名)(10)strstr() 查找字符串的首次出现(11)addslashes 使用反斜线引用字符串15、PHP处理时间的常用函数?(重点看函数的‘参数’和‘返回值’)(1)date() 格式化一个本地时间/日期。(2)getdate() 取得日期/时间信息。(3)date_default_timezone_set() 设定默认时区。(4)date_default_timezone_get() 返回默认时区。(5)mktime() 返回一个日期的 Unix时间戳。(6)strtotime() 将任何字符串的日期时间描述解析为 Unix 时间戳(7)strftime() 根据区域设置格式化本地时间/日期16、PHP处理数据库的常用函数?(重点看函数的‘参数’和‘返回值’)请参照php手册,认真查看,此项非常重要17、PHP操作文件的常用函数?(重点看函数的‘参数’和‘返回值’)(1)打开文件 fopen()(2)读取文件 fgets() ; 注:file_get_contents()也是读取文件(3)写入文件fwrite() ; 注:file_put_contents()同样可以写入文件(4)关闭文件句柄 fclose()(5)移动 / 重命名文件 rename()(6)复制文件 copy()(7)创建文件 vim 或 touch(8)删除文件 unlink()(9)获取文件上次访问的时间 fileatime()(10)获取文件上次修改的时间 filemtime()(11)获取文件大小 filesize()(12)获取文件类型 filetype()(13)获取文件详细信息 state()(14)判断是否是目录 is_dir()18、PHP操作目录(文件夹)的常用函数?(重点看函数的‘参数’和‘返回值’)(1)打开目录 opendir()(2)读取目录 readdir()(3)删除目录 rmdir()(4)关闭目录句柄 closedir()(5)创建目录 mkdir()(6)返回路径中的目录部分 dirname()(7)取得当前工作目录 getcwd()(8)列出指定路径中的文件和目录 scandir()二 、数据库部分常见的关系型数据库管理系统产品有?答:Oracle、SQL Server、MySQL、Sybase、DB2、Access等。SQL语言包括哪几部分?每部分都有哪些操作关键字?答:SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等数据操纵:Select ,insert,update,delete,数据控制:grant,revoke数据查询:select完整性约束包括哪些?数据完整性(Data Integrity)是指数据的精确(Accuracy) 和 可靠性(Reliability)。包括:(1)实体完整性:规定表的每一行在表中是惟一的实体。(2)域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。(3)参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。(4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。什么是事务?及其特性?事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。特性:(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。简单理解:在事务里的操作,要么全部成功,要么全部失败。什么是锁?数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。基本锁类型:锁包括行级锁和表级锁什么叫视图?游标是什么?视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。什么是存储过程?用什么来调用?存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。索引的作用?和它的优点缺点是什么?索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。如何通俗地理解三个范式?第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。。什么是基本表?什么是视图?基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表试述视图的优点?(1) 视图能够简化用户的操作(2) 视图使用户能以多种角度看待同一数据;(3) 视图为数据库提供了一定程度的逻辑独立性;(4) 视图能够对机密数据提供安全保护。NULL是什么意思NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。使用IS NULL来进行NULL判断主键、外键和索引的区别?主键、外键和索引的区别定义:主键–唯一标识一条记录,不能有重复的,不允许为空外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值索引–该字段没有重复值,但可以有一个空值作用:主键–用来保证数据完整性外键–用来和其他表建立联系用的索引–是提高查询排序的速度个数:主键–主键只能有一个外键–一个表可以有多个外键索引–一个表可以有多个唯一索引你可以用什么来确保表格里的字段只接受特定范围里的值?Check限制,它在数据库表格里被定义,用来限制输入该列的值。说说对SQL语句优化有哪些方法?(选择几条)(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。(3) 避免在索引列上使用计算(4)避免在索引列上使用IS NULL和IS NOT NULL(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?(1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。(2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。因此非相关子查询比相关子查询效率高char和varchar的区别?char是一种固定长度的类型,varchar则是一种可变长度的类型。区别:char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足。(在检索操作中那些填补出来的空格字符将被去掉)。varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。Mysql 的存储引擎,myisam和innodb的区别。MyISAM 是非事务的存储引擎;适合用于频繁查询的应用;表锁,不会出现死锁;不支持事务。适合小数据,小并发innodb是支持事务的存储引擎;适合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。数据表类型有哪些MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?(1)设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。(2) 选择合适的表字段数据类型和存储引擎,适当的添加索引。(3) 做mysql主从复制读写分离。(4)对数据表进行分表,减少单表中的数据量提高查询速度。(5)添加缓存机制,比如redis,memcached等。(6)对不经常改动的页面,生成静态页面(比如做ob缓存)。(7)书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?(1) 确认服务器是否能支撑当前访问量。(2) 优化数据库访问。(3)禁止外部访问链接(盗链), 比如图片盗链。(4)控制文件下载。(5)做负载均衡,使用不同主机分流。(6)使用浏览统计软件,了解访问量,有针对性的进行优化。三、 面向对象部分1、什么是面向对象?(理解着回答)面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节。面向对象有三大特征:封装性、继承性、多态性。现在纯正的OO语言主要是 Java 和 C#,PHP、C++也支持OO,C是面向过程的。2、简述 private、 protected、 public修饰符的访问权限。private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public : 公共成员,完全公开,没有访问限制。3、堆和栈的区别?栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。4、XML 与 HTML 的主要区别语法要求不同:(1)在html中不区分大小写,在xml中严格区分。(2)在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略或者之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。(3) 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。(4)在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。(5)在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。(6) 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。标记不同:(1)html使用固有的标记;而xml没有固有的标记。(2)Html标签是预定义的;XML标签是免费的、自定义的、可扩展的。作用不同:(1)html是用来显示数据的;xml是用来描述数据、存放数据的,所以可以作为持久化的介质!Html将数据和显示结合在一起,在页面中把这数据显示出来;xml则将数据和显示分开。 XML被设计用来描述数据,其焦点是数据的内容。HTML被设计用来显示数据,其焦点是数据的外观。(2)xml不是HTML的替代品,xml和html是两种不同用途的语言。 XML 不是要替换 HTML;实际上XML 可以视作对 HTML 的补充。XML 和HTML 的目标不同HTML 的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容。(3)对于XML最好的形容可能是: XML是一种跨平台的,与软、硬件无关的,处理与传输信息的工具。(4)XML未来将会无所不在。XML将成为最普遍的数据处理和数据传输的工具。5、面向对象的特征有哪些方面?主要有封装,继承,多态。如果是4个方面则加上:抽象。封装:封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。6、抽象类和接口的概念以及区别?抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。区别:(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。(3)抽象类中可以有构造方法,但是接口没有构造方法。(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。7、什么是构造函数,什么是析构函数,作用是什么?构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。8、如何重载父类的方法,举例说明重载,即覆盖父类的方法,也就是使用子类中的方法替换从父类中继承的方法,也叫方法的重写。覆盖父类方法的关键是在子类中创建于父类中相同的方法包括方法的名称、参数和返回值类型。PHP中只要求方法的名称相同即可。9、常用的魔术方法有哪些?举例说明php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。__construct() 实例化类时自动调用。__destruct() 类对象使用结束时自动调用。__set() 在给未定义的属性赋值的时候调用。__get() 调用未定义的属性时候调用。__isset() 使用isset()或empty()函数时候会调用。__unset() 使用unset()时候会调用。__sleep() 使用serialize序列化时候调用。__wakeup() 使用unserialize反序列化的时候调用。__call() 调用一个不存在的方法的时候调用。__callStatic()调用一个不存在的静态方法是调用。__toString() 把对象转换成字符串的时候会调用。比如 echo。__invoke() 当尝试把对象当方法调用时调用。__set_state() 当使用var_export()函数时候调用。接受一个数组参数。__clone() 当使用clone复制一个对象时候调用。10、$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?$this 当前对象self 当前类parent 当前类的父类$this在当前类中使用,使用->调用属性和方法。self也在当前类中使用,不过需要使用::调用。parent在类中使用。11、类中如何定义常量、如何类中调用常量、如何在类外调用常量。类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。定义常量使用关键字const.例如:const PI = 3.1415326;无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,访问常量的格式都是类名加作用域操作符号(双冒号)来调用。即:类名 :: 类常量名;12、作用域操作符::如何使用?都在哪些场合下使用?(1)调用类常量(2)调用静态方法(使用static修饰的类方法)13、__autoload()方法的工作原理是什么?使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。四、THINKPHP部分1、常见的PHP框架答:thinkPHP、laravel、yii、ci 等。2、如何理解TP中的单一入口文件?ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一(但不一定是唯一)的入口。应该说,所有项目都是从入口文件开始的,并且所有的项目的入口文件是类似的。入口文件中主要包括:(1)定义框架路径、项目路径和项目名称(可选)(2)定义调试模式和运行模式的相关常量(可选)(3)载入框架入口文件(必须)3、ThinkPHP中的MVC分层是什么?(理解)MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:模型(M):模型的定义由Model类来完成。控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。但实际上,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。4、如何进行SQL优化?(关于后边的解释同学们可以进行理解,到时根据自己的理解把大体意思说出来即可)(1)选择正确的存储引擎MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。(2)优化字段的数据类型记住一个原则,越小的列会越快。如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。(3)为搜索字段添加索引索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,除非你要搜索的字段是大的文本字段,那应该建立全文索引。(4)避免使用Select 从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。即使你要查询数据表的所有字段,也尽量不要用通配符,善用内置提供的字段排除定义也许能给带来更多的便利。(5)使用 ENUM 而不是 VARCHARENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。(6)尽可能的使用 NOT NULL除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。(7)固定长度的表会更快如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。5、如何理解 ThinkPHP 3.0 架构(核心 + 行为 + 驱动)中的行为?(1)核心(Core):就是框架的核心代码,不可缺少的东西,TP本身是基于MVC思想开发的框架。(2)行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。(3)驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。6、什么是惯例配置?所谓的惯例配置,便是框架的自带的配置文件。该文件在核心框架目录下的convention.php中,配置内容如下。由于该文件属于框架自带的配置文件,在实际的开发过程中,主要给我们做参考实例使用,我们很少去修改该文件的配置内容,更多的是根据需求来按照惯例配置中的字段定义和注释来在模块或者Common中自定义配置内容。7、什么是SQL注入?(理解)SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。8、ThinkPHP如何防止SQL注入?(理解)(1)查询条件尽量使用数组方式,这是更为安全的方式;(2)如果不得已必须使用字符串查询条件,使用预处理机制;(3)使用绑定参数(4)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)(5)使用自动验证和自动完成机制进行针对应用的自定义过滤;(6)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。9、如何开启调试模式?调试模式有什么好处?开启调试模式很简单,只需要在入口文件中增加一行常量定义代码:// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为falsedefine(‘APP_DEBUG’, true);调试模式的优势在于: 开启日志记录,任何错误信息和调试信息都会详细记录,便于调试; 关闭模板缓存,模板修改可以即时生效; 记录SQL日志,方便分析SQL; 关闭字段缓存,数据表字段修改不受缓存影响; 严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署问题; 可以方便用于开发过程的不同阶段,包括开发、测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。10、TP中支持哪些配置模式?优先级?惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置(在没有生效的前提下),所以优先顺序从右到左。11、TP中的URL模式有哪几种?默认是哪种?ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。默认模式为:PATHINFO模式,设置URL_MODEL 为112、TP中系统变量有哪些?如何获取系统变量?(1)系统变量:SERVER、_SERVER、SERVER、_ENV、 _POST、POST、_GET、 REQUEST、_REQUEST、REQUEST、_SESSION和 $_COOKIE变量(2)获取系统变量:{KaTeX parse error: Expected 'EOF', got '}' at position 25: …ver.script_name}̲ // 输出_SERVER[‘SCRIPT_NAME’]变量{KaTeX parse error: Expected 'EOF', got '}' at position 22: …session.user_id}̲ // 输出_SESSION[‘user_id’]变量{KaTeX parse error: Expected 'EOF', got '}' at position 21: ….get.pageNumber}̲ // 输出_GET[‘pageNumber’]变量{KaTeX parse error: Expected 'EOF', got '}' at position 18: …ink.cookie.name}̲ // 输出_COOKIE[‘name’]变量13、ThinkPHP框架中D函数与M函数的区别是什么?M方法实例化模型无需用户为每个数据表定义模型类,D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会自动调用M方法去实例化Model基类。同时对于已实例化过的模型,不会重复去实例化(单例模式)。五、smarty模板引擎1、编译和缓存区别?smarty的编译过程就是把模板拿过来,把里面的标签替换成相应php代码,这就是smarty的编译, 其实就是php和html混合的过程smarty的缓存需要手动开启,smarty的缓存就是把编译好的文件执行后,同时生成一份静态的html页面,再次访问的时候,你访问的就是是html文件了,所以就效率来说,要高一些。2、什么是smarty? Smarty的优点是什么?Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。(也易于程序的多样式开发)Smarty优点(1)速度快:相对其他模板引擎。(2) 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件(3)缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页(4)插件技术:smarty可以自定义插件。不适合使用smarty的地方(1)需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新(2)小项目。小项目因为项目简单而美工与程序员兼于一人的项目3、在模板中使用{$smarty}保留变量{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.get.page}̲ //类似在php脚本中访问_GET[page]{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.cookies.}̲ {smarty.post.}{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.session.}̲ {smarty.server.}在模板中访问php中的变量5、变量调解器2018PHP经典面试题大全汇总(更新)-PHP面试题6、php查询mysql数据库时,查询中文结果时出现的乱码。怎么解决?(1)文件meta(设置浏览器解析的时候)(2)连接数据库时编码设定(3)PHP文件中使用header函数确定编码7、缓存机制如果开启了缓存,smarty同时生成一份静态的html页面,如果在设定的时间没有过期,再次访问的时候,你访问的就是是html文件了,减少了读取数据库,所以就效率来说,要高一些。8、smarty的赋值和载入模板Smarty−>assign(name,value)Smarty->assign(name,value) Smarty−>assign(name,value)Smarty->display(‘index.html’)9、marty模板技术的用途是什么?为了php与html分开,美工和程序员各司其职,互不干扰。10、smarty配置主要有哪几项?(1)引入smarty.class.php;(2) 实例化smarty对象;(3)重新修改默认的模板路径;(4)重新修改默认的编译后文件的路径;(5)重新修改默认的配置文件的路径;(6)重新修改默认的cache的路径。(7) 可以设置是否开启cache。(8)可以设置左侧和右侧定界符。11、smarty在使用过程中需要注意哪些细节?Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,也就是说smarty技术将用户UI与php代码分离开。这样程序员和美工各司其职,互不干扰。12、smarty运用过程中要注意以下几个问题:(1)正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;(2)php页面中使用assign赋值 和display显示页面;(3)smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。六、二次开发系统(DEDE、ecshop)1、对二次开发的理解二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核。2、MVCModel(模型)数据处理。View(视图) 模板显示。Controller(控制器) 控制流程。MVC的概念是什么?各层主要做什么工作?MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。M指Model模型层,V是View视图层(显示层或者用户界面),C是Controller控制器层。使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。在网站开发中,模型层一般负责对数据库表信息进行增删改查,视图层负责显示页面内容,控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,执行完毕后由控制器层决定将结果assign到哪个view层。3、二次开发程序安装后访问时候出现一些警告以及错误根据错误,来修改服务器配置参数以及百度4、功能,模板的更换,功能的添加修改其实也就是面向对象的应用 用,以及模板的更换类似smarty的使用5、用过哪些二次开发的东西?Dedecms phpcms ecshop,基本这些的东西如果基础好了 学习起来都是没问题的。6、像php做一次开发好,还是二次开发好?一般中小企业都用cms系统二次开发,都是为了效率。当然如果想一次开发也行,会用框架而且时间充足的话就可以了,大企业都是团队来开发的,杜绝版权问题。7、二次开发过程中很多类与类之间进行之间的方法访问,是通过什么方式传递的?不是类继承而是对象组合,把实例化好的对象通过global传递进去8、dedecms如果更换目录,后台某项就进不去了如何解决?后台核心设置中修改成现在的 项目目录名称9、dedecms中自定义模型的理解?在织梦系统中有内容模型这个概念,不同内容模型可以用来构建不同内容形式的站点,在系统中自带了以下几种模型:普通文章、图集、软件、商品、分类信息、专题。通过系统自带的模型,我们可以用来构建不同类型的站点,例如:使用图集可以做一个图片站,用软件模型构建一个软件下载站点。当然以上随系统附带的模型被称为系统模型,用户可以自己定义一些模型,比如图书、音乐专辑等,自定义了这些模型才可以构建更多内容形式的站点。相当于我们自动添加了表结构,适应现在当前需求的变化10、dede中概念,设计和使用模板,必须要理解下面几个概念(1)板块(封面)模板:指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。(2)列表模板:指网站某个栏目的所有文章列表的模板,一般用 “list_识别ID.htm” 命名。(3) 档案模板:表示文档查看页的模板,如文章模板,一般用 “article_识别ID.htm” 命名。(4) 其它模板:一般系统常规包含的模板有:主页模板、搜索模板、RSS、JS编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。11、dede中几种标签的使用?列表 内容 等标签 只能在其本范围内使用,列表标签只能在列表中使用,内容标签只能在内容标签中使用。全局标签能在所有页面中使用12、熟悉常用类库(例如:dedesql.class.php);熟悉系统函数库(common.func.php);熟悉自定义函数库(extend.func.php);熟悉前台入口文件(common.inc.php)七、微信公众平台开发1、微信运行机制公众号与php之间用什么语言通信:XmlWeixin.php中是如何接收公众号数据的:postStr =postStr=GLOBALS[“HTTP_RAW_POST_DATA”];//接收数据 XML数据2、消息类型微信目前提供了7种基本消息类型,分别为:(1)文本消息(text);(2)图片消息(image);(3)语音(voice)(4)视频(video)(5)地理位置(location);(6)链接消息(link);(7)事件推送(event)类型。掌握不同的消息类型发送时的数据传递格式3、将整个文件读入一个字符串的函数是File_get_contents4、常用函数把xml数据解析成对象的函数是simplexml_load_string( )将字符串转换为数组的函数是___ explode_________,将数组转化为字符串的函数是____implode________.编码 URL 字符串的字符串是____urlencode________.5、Sprintf函数的作用这个都是可以查手册的。6、微信公众号出现无法提供服务的原因?(1)网络原因 ,数据接口原因(2)代码错误,怎么推测原因修改的哪里检查一下,如果代码没错可以输出数据 看一下。用php操作文件$myfile = fopen(“newfile.txt”, “w”);txt="aaaaaaaaaa";fwrite(txt ="aaaaaaaaaa";fwrite(txt="aaaaaaaaaa";fwrite(myfile, txt);fclose(txt);fclose(txt);fclose(myfile);7、自定义菜单的事件推送单击单击跳转链接扫码推事件扫码推且弹出弹出系统拍照发图的事件弹出微信相册发图器的事件弹出地理位置选择器的事件8、token的作用安全机制验证,用于微信服务器与PHP服务器之间的安全验证9、Appid与secrect的作用请求api接口(例如菜单的操作)时需要传appid与secrect两个值,用来获取应用的授权码
文章
XML  ·  SQL  ·  存储  ·  缓存  ·  前端开发  ·  关系型数据库  ·  PHP  ·  数据库  ·  数据格式  ·  索引
2023-01-04
从0开始构建一个属于你自己的PHP框架
如何构建一个自己的PHP框架 为什么我们要去构建一个自己的PHP框架?可能绝大多数的人都会说“市面上已经那么多的框架了,还造什么轮子?”。我的观点“造轮子不是目的,造轮子的过程中汲取到知识才是目的”。 那怎样才能构建一个自己的PHP框架呢?大致流程如下: 入口文件 ----> 注册自加载函数          ----> 注册错误(和异常)处理函数          ----> 加载配置文件          ----> 请求          ----> 路由           ---->(控制器 <----> 数据模型)          ----> 响应          ----> json          ----> 视图渲染数据  除此之外我们还需要单元测试、nosql支持、接口文档支持、一些辅助脚本等。最终我的框架目录如下: 框架目录一览 app                             [PHP应用目录]  ├── demo                        [模块目录]  │   ├── controllers             [控制器目录]  │   │      └── Index.php        [默认控制器文件,输出json数据]  │   ├── logics                  [逻辑层,主要写业务逻辑的地方]  │   │   ├── exceptions          [异常目录]  │   │   ├── gateway          [一个逻辑层实现的gateway演示]  │   │   ├── tools               [工具类目录]  │   │   └── UserDefinedCase.php [注册框架加载到路由前的处理用例]  │   └── models                  [数据模型目录]  │       └── TestTable.php       [演示模型文件,定义一一对应的数据模型]  ├── config                      [配置目录]  │    ├── demo                   [模块配置目录]  │    │   ├── config.php         [模块自定义配置]  │    │   └── route.php          [模块自定义路由]  │    ├── common.php             [公共配置]  │    ├── database.php           [数据库配置]  │    └── nosql.php              [nosql配置]  docs                            [接口文档目录]  ├── apib                        [Api Blueprint]  │    └── demo.apib              [接口文档示例文件]  ├── swagger                     [swagger]  framework                       [Easy PHP核心框架目录]  ├── exceptions                  [异常目录]  │      ├── CoreHttpException.php[核心http异常]  ├── handles                     [框架运行时挂载处理机制类目录]  │      ├── Handle.php           [处理机制接口]  │      ├── ErrorHandle.php      [错误处理机制类]  │      ├── ExceptionHandle.php  [未捕获异常处理机制类]  │      ├── ConfigHandle.php     [配置文件处理机制类]  │      ├── NosqlHandle.php      [nosql处理机制类]  │      ├── LogHandle.php        [log机制类]  │      ├── UserDefinedHandle.php[用户自定义处理机制类]  │      └── RouterHandle.php     [路由处理机制类]  ├── orm                         [对象关系模型]  │      ├── Interpreter.php      [sql解析器]  │      ├── DB.php               [数据库操作类]  │      ├── Model.php            [数据模型基类]  │      └── db                   [数据库类目录]  │          └── Mysql.php        [mysql实体类]  ├── nosql                       [nosql类目录]  │    ├── Memcahed.php           [Memcahed类文件]  │    ├── MongoDB.php            [MongoDB类文件]  │    └── Redis.php              [Redis类文件]  ├── App.php                     [框架类]  ├── Container.php               [服务容器]  ├── Helper.php                  [框架助手类]  ├── Load.php                    [自加载类]  ├── Request.php                 [请求类]  ├── Response.php                [响应类]  ├── run.php                     [框架应用启用脚本]  frontend                        [前端源码和资源目录]  ├── src                         [资源目录]  │    ├── components             [vue组件目录]  │    ├── views                  [vue视图目录]  │    ├── images                 [图片]  │    ├── ...  ├── app.js                      [根js]  ├── app.vue                     [根组件]  ├── index.template.html         [前端入口文件模板]  ├── store.js                    [vuex store文件]  public                          [公共资源目录,暴露到万维网]  ├── dist                        [前端build之后的资源目录,build生成的目录,不是发布分支忽略该目录]  │    └── ...  ├── index.html                  [前端入口文件,build生成的文件,不是发布分支忽略该文件]  ├── index.php                   [后端入口文件]  runtime                         [临时目录]  ├── logs                        [日志目录]  ├── build                       [php打包生成phar文件目录]  tests                           [单元测试目录]  ├── demo                        [模块名称]  │      └── DemoTest.php         [测试演示]  ├── TestCase.php                [测试用例]  vendor                          [composer目录]  .git-hooks                      [git钩子目录]  ├── pre-commit                  [git pre-commit预commit钩子示例文件]  ├── commit-msg                  [git commit-msg示例文件]  .babelrc                        [babel配置文件]  .env                            [环境变量文件]  .gitignore                      [git忽略文件配置]  build                           [php打包脚本]  cli                             [框架cli模式运行脚本]  LICENSE                         [lincese文件]  logo.png                        [框架logo图片]  composer.json                   [composer配置文件]  composer.lock                   [composer lock文件]  package.json                    [前端依赖配置文件]  phpunit.xml                     [phpunit配置文件]  README-CN.md                    [中文版readme文件]  README.md                       [readme文件]  webpack.config.js               [webpack配置文件]  yarn.lock                       [yarn lock文件]  框架模块说明: 入口文件 定义一个统一的入口文件,对外提供统一的访问文件。对外隐藏了内部的复杂性,类似企业服务总线的思想。 // 载入框架运行文件   require('../framework/run.php');  [ file: public/index.php ] 自加载模块 使用spl_autoload_register函数注册自加载函数到__autoload队列中,配合使用命名空间,当使用一个类的时候可以自动载入(require)类文件。注册完成自加载逻辑后,我们就可以使用use和配合命名空间申明对某个类文件的依赖。 [ file: framework/Load.php ] 错误和异常模块 脚本运行期间: 错误: 通过函数set_error_handler注册用户自定义错误处理方法,但是set_error_handler不能处理以下级别错误,E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。所以我们需要使用register_shutdown_function配合error_get_last获取脚本终止执行的最后错误,目的是对于不同错误级别和致命错误进行自定义处理,例如返回友好的提示的错误信息。 [ file: framework/hanles/ErrorHandle.php ] 异常: 通过函数set_exception_handler注册未捕获异常处理方法,目的捕获未捕获的异常,例如返回友好的提示和异常信息。 [ file: framework/hanles/ExceptionHandle.php ] 配置文件模块 加载框架自定义和用户自定义的配置文件。 [ file: framework/hanles/ConfigHandle.php ] 输入和输出 定义请求对象:包含所有的请求信息 定义响应对象:申明响应相关信息 框架中所有的异常输出和控制器输出都是json格式,因为我认为在前后端完全分离的今天,这是很友善的,目前我们不需要再去考虑别的东西。 [ file: framework/Request.php ] [ file: framework/Response.php ] 路由模块 通过用户访问的url信息,通过路由规则执行目标控制器类的的成员方法。我在这里把路由大致分成了四类: 传统路由 domain/index.php?module=Demo&contoller=Index&action=test&username=test  pathinfo路由 domain/demo/index/modelExample  用户自定义路由 // 定义在config/moduleName/route.php文件中,这个的this指向RouterHandle实例  $this->get('v1/user/info', function (Framework\App $app) {      return 'Hello Get Router';  });  微单体路由 我在这里详细说下这里所谓的微单体路由,面向SOA和微服务架构大行其道的今天,有很多的团队都在向服务化迈进,但是服务化过程中很多问题的复杂度都是指数级的增长,例如分布式的事务,服务部署,跨服务问题追踪等等。这导致对于小的团队从单体架构走向服务架构难免困难重重,所以有人提出来了微单体架构,按照我的理解就是在一个单体架构的SOA过程,我们把微服务中的的各个服务还是以模块的方式放在同一个单体中,比如: app  ├── UserService     [用户服务模块]  ├── ContentService  [内容服务模块]  ├── OrderService    [订单服务模块]  ├── CartService     [购物车服务模块]  ├── PayService      [支付服务模块]  ├── GoodsService    [商品服务模块]  └── CustomService   [客服服务模块]  如上,我们简单的在一个单体里构建了各个服务模块,但是这些模块怎么通信呢?如下: App::$app->get('demo/index/hello', [      'user' => 'TIGERB'  ]);  通过上面的方式我们就可以松耦合的方式进行单体下各个模块的通信和依赖了。与此同时,业务的发展是难以预估的,未来当我们向SOA的架构迁移时,很简单,我们只需要把以往的模块独立成各个项目,然后把App实例get方法的实现转变为RPC或者REST的策略即可,我们可以通过配置文件去调整对应的策略或者把自己的,第三方的实现注册进去即可。 [ file: framework/hanles/RouterHandle.php ] 传统的MVC模式提倡为MCL模式 传统的MVC模式包含model-view-controller层,绝大多时候我们会把业务逻辑写到controller层或model层,但是慢慢的我们会发现代码难以阅读、维护、扩展,所以我在这里强制增加了一个logics层。至于,逻辑层里怎么写代码怎么,完全由你自己定义,你可以在里面实现一个工具类,你也可以在里面再新建子文件夹并在里面构建你的业务逻辑代码,你甚至可以实现一个基于责任连模式的网关(我会提供具体的示例)。这样看来,我们的最终结构是这样的: M: models, 职责只涉及数据模型相关操作 C: controllers, 职责对外暴露资源,前后端分离架构下controllers其实就相当于json格式的视图 L: logics, 职责灵活实现所有业务逻辑的地方 logics逻辑层 逻辑层实现网关示例: 我们在logics层目录下增加了一个gateway目录,然后我们就可以灵活的在这个目录下编写逻辑了。gateway的结构如下: gateway                     [Logics层目录下gateway逻辑目录]    ├── Check.php             [接口]    ├── CheckAppkey.php       [检验app key]    ├── CheckArguments.php    [校验必传参数]    ├── CheckAuthority.php    [校验访问权限]    ├── CheckFrequent.php     [校验访问频率]    ├── CheckRouter.php       [网关路由]    ├── CheckSign.php         [校验签名]    └── Entrance.php          [网关入口文件]  网关入口类主要负责网关的初始化,代码如下: // 初始化一个:必传参数校验的check  $checkArguments   =  new CheckArguments();  // 初始化一个:app key check  $checkAppkey      =  new CheckAppkey();  // 初始化一个:访问频次校验的check  $checkFrequent    =  new CheckFrequent();  // 初始化一个:签名校验的check  $checkSign        =  new CheckSign();  // 初始化一个:访问权限校验的check  $checkAuthority   =  new CheckAuthority();  // 初始化一个:网关路由规则  $checkRouter      =  new CheckRouter();    // 构成对象链  $checkArguments->setNext($checkAppkey)                 ->setNext($checkFrequent)                 ->setNext($checkSign)                 ->setNext($checkAuthority)                 ->setNext($checkRouter);    // 启动网关  $checkArguments->start(      APP::$container->getSingle('request')  );  实现完成这个gateway之后,我们如何在框架中去使用呢?在logic层目录中我提供了一个user-defined的实体类,我们把gateway的入口类注册到UserDefinedCase这个类中,示例如下: /**   * 注册用户自定义执行的类   *   * @var array   */  private $map = [      // 演示 加载自定义网关      'App\Demo\Logics\Gateway\Entrance'  ];  这样这个gateway就可以工作了。接着说说这个UserDefinedCase类,UserDefinedCase会在框架加载到路由机制之前被执行,这样我们就可以灵活的实现一些自定义的处理了。这个gateway只是个演示,你完全可以天马行空的组织你的逻辑~ 视图View去哪了?由于选择了完全的前后端分离和SPA(单页应用), 所以传统的视图层也因此去掉了,详细的介绍看下面。 [ file: app/* ] 使用Vue作为视图 源码目录 完全的前后端分离,数据双向绑定,模块化等等的大势所趋。这里我把我自己开源的vue前端项目结构 easy-vue 移植到了这个项目里,作为视图层。我们把前端的源码文件都放在frontend目录里,详细如下,你也可以自己定义: frontend                        [前端源码和资源目录,这里存放我们整个前端的源码文件]  ├── src                         [资源目录]  │    ├── components             [编写我们的前端组件]  │    ├── views                  [组装我们的视图]  │    ├── images                 [图片]  │    ├── ...  ├── app.js                      [根js]  ├── app.vue                     [根组件]  ├── index.template.html         [前端入口文件模板]  └── store.js                    [状态管理,这里只是个演示,你可以很灵活的编写文件和目录]  build步骤 yarn install   DOMAIN=http://你的域名 npm run dev  编译后 build成功之后会生成dist目录和入口文件index.html在public目录中。非发布分支.gitignore文件会忽略这些文件,发布分支去除忽略即可。 public [公共资源目录,暴露到万维网]   ├── dist [前端build之后的资源目录,build生成的目录,不是发布分支忽略该目录]  │ └── ...   ├── index.html [前端入口文件,build生成的文件,不是发布分支忽略该文件]  [ file: frontend/* ] 数据库对象关系映射 数据库对象关系映射ORM(Object Relation Map)是什么?按照我目前的理解:顾名思义是建立对象和抽象事物的关联关系,在数据库建模中model实体类其实就是具体的表,对表的操作其实就是对model实例的操作。可能绝大多数的人都要问“为什么要这样做,直接sql语句操作不好吗?搞得这么麻烦!”,我的答案:直接sql语句当然可以,一切都是灵活的,但是从一个项目的 可复用,可维护, 可扩展 出发,采用ORM思想处理数据操作是理所当然的,想想如果若干一段时间你看见代码里大段的难以阅读且无从复用的sql语句,你是什么样的心情。 市面上对于ORM的具体实现有thinkphp系列框架的Active Record,yii系列框架的Active Record,laravel系列框架的Eloquent(据说是最优雅的),那我们这里言简意赅就叫ORM了。接着为ORM建模,首先是ORM客户端实体DB:通过配置文件初始化不同的db策略,并封装了操作数据库的所有行为,最终我们通过DB实体就可以直接操作数据库了,这里的db策略目前我只实现了mysql(负责建立连接和db的底层操作)。接着我们把DB实体的sql解析功能独立成一个可复用的sql解析器的trait,具体作用:把对象的链式操作解析成具体的sql语句。最后,建立我们的模型基类model,model直接继承DB即可。最后的结构如下: ├── orm                         [对象关系模型]  │      ├── Interpreter.php      [sql解析器]  │      ├── DB.php               [数据库操作类]  │      ├── Model.php            [数据模型基类]  │      └── db                   [数据库类目录]  │          └── Mysql.php        [mysql实体类]  DB类使用示例 /**   * DB操作示例   *   * findAll   *   * @return void   */  public function dbFindAllDemo()  {      $where = [          'id'   => ['>=', 2],      ];      $instance = DB::table('user');      $res      = $instance->where($where)                           ->orderBy('id asc')                           ->limit(5)                           ->findAll(['id','create_at']);      $sql      = $instance->sql;        return $res;  }  Model类使用示例 // controller 代码  /**   * model example   *   * @return mixed   */  public function modelExample()  {      try {           DB::beginTransaction();          $testTableModel = new TestTable();            // find one data          $testTableModel->modelFindOneDemo();          // find all data          $testTableModel->modelFindAllDemo();          // save data          $testTableModel->modelSaveDemo();          // delete data          $testTableModel->modelDeleteDemo();          // update data          $testTableModel->modelUpdateDemo([                 'nickname' => 'easy-php'              ]);          // count data          $testTableModel->modelCountDemo();            DB::commit();          return 'success';        } catch (Exception $e) {          DB::rollBack();          return 'fail';      }  }   //TestTable model  /**   * Model操作示例   *   * findAll   *   * @return void   */  public function modelFindAllDemo()  {      $where = [          'id'   => ['>=', 2],      ];      $res = $this->where($where)                  ->orderBy('id asc')                  ->limit(5)                  ->findAll(['id','create_at']);      $sql = $this->sql;        return $res;  }  [ file: framework/orm/* ] 服务容器模块 什么是服务容器? 服务容器听起来很浮,按我的理解简单来说就是提供一个第三方的实体,我们把业务逻辑需要使用的类或实例注入到这个第三方实体类中,当需要获取类的实例时我们直接通过这个第三方实体类获取。 服务容器的意义? 用设计模式来讲:其实不管设计模式还是实际编程的经验中,我们都是强调“高内聚,松耦合”,我们做到高内聚的结果就是每个实体的作用都是极度专一,所以就产生了各个作用不同的实体类。在组织一个逻辑功能时,这些细化的实体之间就会不同程度的产生依赖关系,对于这些依赖我们通常的做法如下: class Demo  {      public function __construct()      {          // 类demo直接依赖RelyClassName          $instance = new RelyClassName();      }  }  这样的写法没有什么逻辑上的问题,但是不符合设计模式的“最少知道原则”,因为之间产生了直接依赖,整个代码结构不够灵活是紧耦合的。所以我们就提供了一个第三方的实体,把直接依赖转变为依赖于第三方,我们获取依赖的实例直接通过第三方去完成以达到松耦合的目的,这里这个第三方充当的角色就类似系统架构中的“中间件”,都是协调依赖关系和去耦合的角色。最后,这里的第三方就是所谓的服务容器。 在实现了一个服务容器之后,我把Request,Config等实例都以单例的方式注入到了服务容器中,当我们需要使用的时候从容器中获取即可,十分方便。使用如下: // 注入单例  App::$container->setSingle('别名,方便获取', '对象/闭包/类名');    // 例,注入Request实例  App::$container->setSingle('request', function () {      // 匿名函数懒加载      return new Request();  });  // 获取Request对象  App::$container->getSingle('request');  [ file: framework/Container ] Nosql模块 提供对nosql的支持,提供全局单例对象,借助我们的服务容器我们在框架启动的时候,通过配置文件的配置把需要的nosql实例注入到服务容器中。目前我们支持redis/memcahed/mongodb。 如何使用?如下, // 获取redis对象  App::$container->getSingle('redis');  // 获取memcahed对象  App::$container->getSingle('memcahed');  // 获取mongodb对象  App::$container->getSingle('mongodb');  [ file: framework/nosql/* ] 接口文档生成和接口模拟模块 通常我们写完一个接口后,接口文档是一个问题,我们这里使用Api Blueprint协议完成对接口文档的书写和mock(可用),同时我们配合使用Swagger通过接口文档实现对接口的实时访问(目前未实现)。 Api Blueprint接口描述协议选取的工具是snowboard,具体使用说明如下: 接口文档生成说明 cd docs/apib   ./snowboard html -i demo.apib -o demo.html -s   open the website, http://localhost:8088/  接口mock使用说明 cd docs/apib   ./snowboard mock -i demo.apib   open the website, http://localhost:8087/demo/index/hello  [ file: docs/* ] 单元测试模块 基于phpunit的单元测试,写单元测试是个好的习惯。 如何使用? tests目录下编写测试文件,具体参考tests/demo目录下的DemoTest文件,然后运行: vendor/bin/phpunit  测试断言示例: /**   * 演示测试   */  public function testDemo()  {      $this->assertEquals(          'Hello Easy PHP',          // 执行demo模块index控制器hello操作,断言结果是不是等于'Hello Easy PHP'           App::$app->get('demo/index/hello')      );  }  phpunit断言文档语法参考 [ file: tests/* ] Git钩子配置 目的规范化我们的项目代码和commit记录。 代码规范:配合使用php_codesniffer,在代码提交前对代码的编码格式进行强制验证。 commit-msg规范:采用ruanyifeng的commit msg规范,对commit msg进行格式验证,增强git log可读性和便于后期查错和统计log等, 这里使用了 Treri 的commit-msg脚本,Thx~。 [ file: ./git-hooks/* ] 辅助脚本 cli脚本 以命令行的方式运行框架,具体见使用说明。 build脚本 打包PHP项目脚本,打包整个项目到runtime/build目录,例如: runtime/build/App.20170505085503.phar   <?php  // 入口文件引入包文件即可  require('runtime/build/App.20170505085503.phar')  [ file: ./build ] 如何使用? 执行: composer install chmod -R 777 runtime 网站服务模式: 步骤 1: yarn install 步骤 2: DOMAIN=http://localhost:666 npm run demo 步骤 3: cd public 步骤 4: php -S localhost:666 访问网站:http://localhost:666/index.html 访问接口:http://localhost:666/Demo/Index/hello demo如下: 客户端脚本模式: php cli --method= --= ...   例如, php cli --method=demo.index.get --username=easy-php  获取帮助: 使用命令 php cli 或者 php cli --help 问题和贡献 不足的地方还有很多,如果大家发现了什么问题,可以给我提 issue 或者PR。 或者你觉着在这个框架实现的细节你想了解的,一样可以给我提 issue ,后面我会总结成相应的文章分享给大家。 如何贡献? cp ./.git-hooks/* ./git/hooks  然后正常发起PR即可, 所有的commit我都会进行代码格式(psr)验证和commit-msg验证,如果发生错误,请按照提示纠正即可。 项目地址: https://github.com/TIGERB/easy-php TODO 懒加载优化框架加载流程 性能测试和优化 变更Helper助手类的成员方法为框架函数,简化使用提高生产效率 提供更友善的开发api帮助 模块支持数据库nosql自定义配置 支持mysql主从配置 ORM提供更多链式操作api 框架log行为进行级别分类 想办法解决上线部署是配置文件问题 基于phar文件和git webhook自动化打包部署 ... 作者:佚名 来源:51CTO
文章
前端开发  ·  PHP  ·  数据库  ·  容器  ·  NoSQL  ·  SQL  ·  测试技术  ·  开发工具  ·  git  ·  JavaScript
2017-08-01
PHP知识大全
---------------------------------------------------------                      PHP知识大全 --------------------------------------------------------- 1. 变量如何定义?如何检查变量是否定义?如何删除一个变量?怎样检测变量是否设置?        $定义   isset()// 检测变量是否设置         defined()// 检测常量是否设置        unset()//销毁指定的变量        empty()// 检测变量是否为空   2. 什么是可变变量?        一个变量的变量名可以动态的设置和使用。        $a = 'hello' , $$a = 'world',  ${$a}=hello world   3. 变量赋值方式有哪几种?        1)直接赋值   2)变量间赋值   3)引用赋值   4. 引用和拷贝有什么区别?        拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。        引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。   5. php中变量有哪些基本数据类型?        php支持8种原始数据类型包括:        四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string)        两种复合类型(数组array , 对象object)        两种特殊类型(资源resource,NULL)   6. 其它类型转换为boolean类型时,哪些被认为是false?        布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串'0', 空数组,特殊数据类型NULL, 没有设定的变量。      empty()函数在哪些情况下返回true?        布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串'0', array()空数组,特殊数据类型NULL, 没有任何属性的对象,没有赋值的变量。   7. 如果定义了一个变量$a ,但是没有赋初始值              那么$a==0吗?    $a==false吗?    $a==''吗?        $a==NULL吗?    $a===NULL吗?     答:echo=>什么都没有 , var_dump=>NULL        empty($b)==true吗?———————————— echo=>1 , var_dump=>bool(true)        此时如果输出$a++是多少?———————   echo=>什么都没有 , var_dump=>NULL        如果输出++$a又是多少?—————————      echo=>1  , var_dump=>int(1)   8. 字符串怎么转成整数,有几种方法?怎么实现?        强制类型转换: (整型)字符串变量名;        直接转换:settype(字符串变量,整型);        intval(字符串变量);   9. 标量数据和数组的最大区别是什么?        一个标量只能存放一个数据,而数组可以存放多个数据。   10. 常量如何定义? 如何检测一个常量是否被定义?常量的值只能是哪些数据类型?        define()//定义常量 , defined()//检查常量是否定义        常量的值只能是标量类型的数据。   11. 常量分为系统内置常量和自定义常量。请说出最常见的几个系统内置常量?        __FILE__ , __LINE__ , PHP_OS , PHP_VERSION   12. 如果定义了两个相同的常量,前者和后者哪个起作用?        前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。   13. 常量和变量有哪些区别?        1)常量前没有$符号;        2)常量只能通过define()定义,而不能通过赋值语句定义;        3)常量可以在任何地方定义和访问,而变量有全局和局部之分;        4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定义;        5)常量的值只能是标量数据,而变量的数据库类型有8种原始数据类型。   14. PHP中常用的几个预定义的全局数组变量是哪些?        有9大预定义的内置数组变量:        $_POST, $_GET, $_REQUEST, $_SESSION, $_COOKIE, $_FILES,$_SERVER, $_ENV, $GLOBALS   15. 在实际开发中,常量最常用于哪些地方?        1)连接数据库的信息定义成常量,如数据库服务器的用户名、密码、数据库名、主机名;        2)将站点的部分路径定义成常量,如web绝对路径,smarty的安装路径,model、view或者controller的文件夹路径;        3)网站的公共信息,如网站名称,网站关键词等信息。   16. 函数的优越性有哪些?        提高程序的可维护性  提高软件的可靠性  提高程序的可重用性  提高程序的开发效率   17. 如何定义一个函数?函数名区分大小写吗?        1)使用 function 关键字;        2)函数命名规则和变量一样,以字母或者下划线开头,而不能以数字开头;        3)函数名不区分大小写;        4)函数名不可以使用已经声明过的或者系统自建的函数名称。   18. 什么是变量的能见度 或者 说是变量作用域?        就是变量在程序中的可作用范围。根据变量的能见度,变量分为局部变量和全局变量。   19. 什么是局部变量和全局变量?函数内是否可以直接调用全局变量?        局部变量是函数内部定义的变量,其作用域是所在的函数。如果函数外还有一个跟局部变量名字一样的变量,程序会认为它们两个是完全不同的两个变量。当退出函数的时候,其中的局部变量就同时被清除。全局变量是定义在所有函数以外的变量,其作用域是整个php文件,但是在用户自定义的函数内部是无法使用的。如果一定要在用户自定义的函数内部使用全局变量,那么就需要使用global关键字声明。也就是说如果在函数内的变量前加上golbal来修饰,那么函数内部就可以访问到这个全局变量,不仅可以利用这个全局变量进行运算而且可以对这个全局变量进行重新赋值。全局变量还可以使用 $GLOBALS['var'] 来调用。   21. 什么是静态变量?        如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。        一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时,该变量会在函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。   22. php中函数传递参数的方式有哪些?两者有什么区别?        按值传递和按地址传递(或按引用传递)        (1)按值传递:  待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对                该变量值做的修改,不影响原本的变量值。      (2)按地址传递: 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存中是同一个。函数体做的修改,直接影响到函数体外部的该变量的值。     23. 什么是递归函数?如何进行递归调用?        递归函数其实就是调用自身的函数,但是必须满足以下两个条件:        1)在每一次调用自身时,必须是更接近于最终结果;        2)必须有一个确定的递归终止条件,不会造成死循环。        举例说明:        在实际工作中往往会在遍历文件夹的时候使用。        如果有个例子是希望获取到目录windows下所有的文件,那么先遍历windows目录,如果发现其中还有文件夹,那么就会调用自身,继续往下寻找,依次类推,        直到遍历到再也没有文件夹为止,这也就是意味着遍历出来了所有的文件。   24. 判断一个函数是否存在?      function_exists( string $function_name )  如果存在,返回true, 不存在则返回 false。   25. func()和@func()之间有什么区别?        第二个函数调用失败不会报错,第一个会报错   26. include()和require()函数的用法和区别是什么?include_once()和require_once()呢?        include和require出现错误后的错误级别不一样        include_once()和require_once()在加载之前要判断是否已经导入   27. 说出前置++和后置++的区别?        前置++是先将变量增加1,然后在将值赋值给原来的变量;        后置++是先返回变量的当前值,然后再将变量的当前值增加1.   28. 字符串运算符“.”与算术运算符“+”有什么区别?        当“a”“b”之间使用.时认为是连字符。如果两者间是+的时候php会认为是一次运算。        1)如果+号两边的字符串是数字组成的,那么会将字符串自动转为整型;        2)如果+号两边是纯粹的字母,那么会输出0;        3)如果+号两边的字符串是以数字开头的,那么会截取字符串开头的数字,然后进行运算。   29. 什么是三目(或三元)运算符?        根据一个表达式的结果在另两个表达式中选择一个。        例如: ($a==true) ? 'good':'bad';   30. 控制流程语句有哪些?        1:三种程序结构    顺序结构、分支结构、循环结构        2:分支: if/esle/esleif/     switch/case/default        3: switch 需要注意的:               case子句中的常量可以是整型、字符串型常量、 或者常量表达式,不允许是变量。              同一个switch子句中,case的值不能相同,否则只能取到首次出现case中的值。        4: 循环  for while   do...while          do...while 后面必须加入分号结尾。          while 和 do...while 的区别        5:break 和 continue 的区别。               break可以终止循环。               continue没有break强大,只能终止本次循环而进入到下一次循环中。   31. 数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种?        数组是一个可以存储一组或一系列数值的变量(复合型变量)        索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值)        数组的赋值方式有哪两种?        数组的声明方式主要有两种。        1.通过array()函数声明数组; 可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。        2.直接为数组元素赋值,不需要调用array()函数。例如:        $arr[0] = 1;     $arr[1] = 2;        特别注意:        数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。        例如: $array[3] 与  $array['3'] 引用的是相同的一个元素,而 $array['03'] 引用的则就是另外的一个元素了。   32.数组如何遍历?        ①for循环        ②foreach循环  ,这是最常用的遍历方式。用法如下:foreach($arr as $key=>$value){}        ③list each 和while 配合起来循环   33. foeach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢?        当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset().        reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。   34. 如何计算数组长度(或者说计算数组中所有元素的个数)?字符串怎么取长度?        count() -- 计算数组中的元素个数。        可以使用count(数组名)或者count(数组名,1),如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。如果第二个参数是数字0,则等同于只有一个参数的count()函数。        sizeof() -- count() 的别名(count — 计算数组中的单元数目或对象中的属性个数) 字符串:strlen()— 获取字符串长度         mb_strlen()— Get string length   35. 数组中相关的常用函数有哪些?        1) count --(sizeof别名)— 计算数组中的单元数目或对象中的属性个数                  例如:int count ( mixed $var [, int $mode ] )  $var 通常都是数组类型,任何其它类型都只有一个单元。  $mode 默认值为0. 1为开启递归地对数组计数        2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 检查数组中是否存在某个值。如果needle 是字符串,则比较是区分大小写的。如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查needle 的类型是否和 haystack 中的相同。        3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。               特别注意:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。               如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引          4) 数组与字符串之间的转换               (1)explode ( string $separator , string $string [, int $limit ] )  使用一个分隔字符来分隔一个字符串。               (2)implode ( string $glue , array $arr )  使用一个连接符将数组中的每个单元连接为一个字符串。join为 implode 的别名        5) sort(array &$array [, int $sort_flags ]) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。   36. 数组合并函数array_merge()和数组加法运算$arr + $arr2 的区别是什么?        array_merge()->使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是后者附加到前者后面。"+"->使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃,也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。   37. 字符串定义的时候单引号和双引号有什么区别?        单引号加载速度比双引号加载速度快 38. echo(),print(),print_r()的区别?        (1)echo 是语法,Output one or more strings,没有返回值;        (2)print 是函数,不能输出数组和对象,Output a string,print有返回值;        (3)print_r 是函数,可以输出数组。print_r是个比较有意思的函数,可以输出stirng、int、float、    array、object等,输出array时会用结构表示,print_r输出成功时返回true;而且print_r可以通过print_r($str,true)来,使print_r不输出而返回print_r处理后的值。此外,对于echo和print,基本以使用echo居多,因为其效率比print要高。   39. 按照功能分类说说都有哪些字符串处理函数?这些函数的作用是什么?        A. 字符串输出函数        (1)echo $a,$b,$c......;  是一个语言结构,而不是一个真正的函数。        (2)print($a)    本函数输出字符串。若成功则返回 1,失败返回 0        (3)print_r($a)        (4)var_dump($a); 能输出类型、长度、值        B. 去除字符串首尾空格的函数: trim  ltrim  rtrim(别名:chop)   使用第二个参数,还可以去除指定的字符。        C. 转义字符串函数:addslashes()        D. 获取字符串长度的函数:strlen()        E. 截取字符串长度的的函数:substr()        F. 检索字符串函数: strstr() , strpos()        G. 替换字符串函数:str_replace()   40. 请给出以下问题的正确答案?        1).$arr = array('james', 'tom', 'symfony');请将$arr数组的值用’,’分割并合并成字符串输出?          echo implode(‘,’,$arr);        2).$str = ‘jack,james,tom,symfony’; 请将$str用’,’分割,并把分割后的值放到$arr数组中?           $arr = explode(‘,’,$str);        3).$arr = array(3,7,2,1,’d’,’abc’);   请将$arr按照从大到小的顺序排序,并保持其键值不变?          arsort($arr); print_r($arr);        4).$mail = “gaofei@163.com”;    请将此邮箱的域(163.com)取出来并打印,看最多能写出几种方法?               echo strstr($mail,'163');               echo substr($mail,7);               $arr = explode("@",$mail); echo $arr[1];        5). 如果有一个字符串,该字符串是“123,234,345,”。请问如何切割掉这个字符串最后一个逗号?        6). 获取随机数的函数有哪几个?mt_rand() 和 rand()哪个执行速度快?   41.页面字符出现乱码,怎么解决?        1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是        在header()函数中指定了charset;        例如:        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />        header(“content-type:text/html;charset=utf-8”);        2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致,        两者必须保持统一;        3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一,        例如:mysql_query(“set names utf8”)。   42. 正则表达式是什么?php中有哪些常用的跟正则相关的函数?请写出一个email的正则,中国手机号码和座机号码的正则表达式?        正则表达式是用于描述字符排列模式的一种语法规则。正则表达式也叫做模式表达式。        网站开发中正则表达式最常用于表单提交信息前的客户端验证。        比如验证用户名是否输入正确,密码输入是否符合要求,email、手机号码等信息的输入是否合法        在php中正则表达式主要用于字符串的分割、匹配、查找和替换操作。               preg系列函数可以处理。具体有以下几个:        string preg_quote ( string str [, string delimiter] )        转义正则表达式字符 正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。        preg_replace -- 执行正则表达式的搜索和替换        mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]        preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换        mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )        preg_split -- 用正则表达式分割字符串        array preg_split ( string pattern, string subject [, int limit [, int flags]] )          常用的正则表达式写法:        中文:/^[\u4E00-\u9FA5]+$/        手机号码:/^(86)?0?1\d{10}$/        EMAIL:        /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/        密码(安全级别中):        /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/        密码(安全级别高):        /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/   44. preg_replace()和 str_ireplace()两个函数在使用上有什么不同?preg_split()和split()函数如何使用?   preg_replace — 执行正则表达式的搜索和替换   str_ireplace — str_replace() 的忽略大小写版本   str_replace — 子字符串替换            preg_split — 用正则表达式分割字符串        split — 用正则表达式将字符串分割到数组中   45. 获取当前时间戳的函数主要有哪些?用PHP打印出今天的时间,格式是2010-12-10 22:21:21?        用PHP打印出前一天的时间格式是2010-12-10 22:21:21?如何把2010-12-25 10:30:25变成unix时间戳?        echo date ("Y-m-d H:i:s" ,strtotime(‘-1,days’));            date('Y-m-d H:i:s',time());          $unix_time = strtotime("2009-9-2 10:30:25");//变成unix时间戳        echo date("Y-m-d H:i:s",$unix_time);//格式化为正常时间格式   46.  在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?        用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入<script>alert(111);</script>),php端接收数据的时候,应该如何处理?        使用urlencode()对中文进行编码,使用urldecode()来解码。           使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。   48. 说说mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之间有什么区别?        第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个既可以返回索引数组也可以返回关联数组,取决于它的第二个参数 MYSQL_BOTH MYSQL_NUM  MYSQL_ASSOC 默认为MYSQL_BOTH        $sql =”select * from table1”;        $result = mysql_query($sql);        mysql_fetch_array($result, MYSQL_NUM);   49. 请说出目前学过的返回是资源的函数?        答:       fopen(打开文件)                 imagecreatefromjpeg(png gif) — 从 JPEG 文件新建一图像                 imagecreatetruecolor — 新建一个真彩色图像                 imagecopymerge — 拷贝并合并图像的一部分                 imagecopyresized  — 拷贝部分图像并调整大小                 mysql_connect  — 打开一个到 MySQL 服务器的连接               mysql_query();只有这执行select的时候成功,才返回资源,失败返回FALSE               50. 打开、关闭文件分别是什么函数? 文件读写是什么函数?删除文件是哪个函数?        判断一个文件是否存在是哪个函数?新建目录是哪个函数?   51. 文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?        1.首现要在php.ini中开启文件上传;        2.在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改;        3.上传表单一定要记住在form标签中写上enctype="multipart/form-data";        4. 提交方式 method 必须是 post;        5. 设定 type="file" 的表单控件;        6.要注意上传文件的大小MAX_FILE_SIZE、文件类型是否符合要求,上传后存放的路径是否存在。 可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名,这样就避免了重名。可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成将文件保存到指定目录。     52. $_FILES是几维数组?第一维和第二维的索引下标分别是什么?批量上传文件的时候需要注意什么?        二维数组。第一维是上传控件的name,二维下标分别为name/type/tmp_name/size/error.   53. header()函数主要的功能有哪些?使用过程中注意什么?        答:     header()发送http头信息    -header("content-type:text/html; charset=utf-8");-------------------//当前页面输出内容是html,编码为utf-8格式    -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    -header("content-type:image/png gif jpeg");----------------------------------//当前页面输出内容的格式是图片    -header("refresh:5;url=http://www.1004javag.com/five/string.php");--//页面5秒后要跳转到新网址 -header("location:http://1004javag.com/five/string.php");-----------//页面重定向 54. 文件下载的时候如果使用header()函数?        答:header("content-type: application/octet-stream;charset=UTF-8"); //在这里加utf-8和在上面定义有什么区别?、??              header("accept-ranges: bytes");             header("accept-length: ".filesize($filedir.$filename));             header("content-disposition: attachment; filename=".$filedir.$filename);     55. 什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么?        ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。    '$'是jQuery的别名.     页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回给这个ajax引擎,   最后由这个ajax引擎来决定将返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。        这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,        减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。               Ajax的优点是:        1.  减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;        2.  在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。        Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。        ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。   56. jquery是什么?jquery简化ajax后的方法有哪些?        jQuery是Javascript的一种框架。        $.get(),$.post(),$.ajax()。$是jQuery对象的别名。          代码如下:        $.post(异步访问的url地址 , {'参数名' : 参数值} , function(msg){               $("#result").html(msg);        });               $.get(异步访问的url地址 , {'参数名' : 参数值} , function(msg){               $("#result").html(msg);        });          $.ajax({               type: "post",               url: loadUrl,               cache:false,               data: "参数名=" + 参数值,               success: function(msg) {                      $("#result").html(msg);               }        });     57. 什么是会话控制?        简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。目前最主要的会话跟踪方式有cookie,session。   58. 会话跟踪的基本步骤        1).访问与当前请求相关的会话对象  2).查找与会话相关的信息        3).存储会话信息     4).废弃会话数据   59. 使用cookie的注意事项有哪些?        1) setcookie()之前不可以有任何页面输出,就是空格,空白行也不可以;        2) setcookie()后,在当前页面调用$_COOKIE['cookiename']不会有输出,必须刷新或到下一个页面才可以看到cookie值;        3) 不同的浏览器对cookie处理不同,客户端可以禁用cookie,浏览器也可以闲置cookie的数量,一个浏览器能创建的cookie数量最多300个,并且每个不可以超过4kb,        每个web站点能设置的cookie总数不能超过20个。        4) cookie是保存在客户端的,用户禁用了cookie,那么setcookie就不会起作用了。所以不可以过度依赖cookie。   60. 使用session的时候,通过什么来表示当前用户,从而与其他用户进行区分?        sessionid,通过session_id()函数可以取得当前的session_id。   61. session和cookie的使用步骤分别是什么?什么是sesssion和cookie的生命周期?session和cookie的区别是什么?        cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,当再次打开浏览器时cookie值依然有效。             session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是哪个用户的。              两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。        session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。           使用session的步骤:        1. 启动session:使用session_start()函数来启动。        2. 注册会话:直接给$_SESSION数组添加元素即可。        3. 使用会话:判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。        4. 删除会话:               1.可以使用unset删除单个session;               2.使用$_SESSION=array()的方式,一次注销所有的会话变量;               3.使用session_destroy()函数来彻底销毁session。        cookie怎么使用?        1. 记录用户访问的部分信息        2. 在页面间传递变量        3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。        创建cookie:setcookie(string cookiename , string value , int expire);        读取cookie:通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。        删除cookie:有两种方法        1.手工删除方法:        右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除。        2.setcookie()方法:        跟设置cookie的方法一样,不过此时将cookie的值设置为空,有效时间为0或小于当前时间戳。   62. 如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效?        一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少?        setcookie(‘username’,’jack’,time()+7*24*3600);        最多可以产生20个cookie,每个最多不超过4K   63. 设置或读取session之前,需要做什么?        可以直接在php.ini中开启session.auto_start = 1或者在页面头部用session_start();        开启session,session_start()前面不能有任何输出,包括空行。   64. 在实际开发中,session在哪些场合使用?        session用来存储用户登录信息和用在跨页面传值。        1)常用在用户登录成功后,将用户登录信息赋值给session;        2)用在验证码图片生成,当随机码生成后赋值给session。   65. 注销session会话的形式有几种?        unset()   $_SESSION=array();   session_destroy();   66. 什么是OOP?什么是类和对象?什么是类属性?        OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象。        世间万物都具有自身的属性和方法,通过这些属性和方法可以区分出不同的物质。        属性和方法的集合就形成了类,类是面向对象编程的核心和基础,        通过类就将零散的用于实现某个功能的代码有效地管理起来了。              类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,类在实例化之后就是对象。类是对象的抽象概念,对象是类的实例化。    对象是一个高级的数组,数组是一个最原始的对象,同样的对象也可以遍历        OOP具有三大特点:         1. 封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。        2. 继承性:就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。 php只支持单继承,也就是说一个子类只能有一个父类。        3. 多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。          OOP的优点:1、代码重用性高(省代码)    2、使程序的可维护性高(扩展性)  3、灵活性           67. 常用的属性的访问修饰符有哪些?分别代表什么含义?        private,protected,public。           类外:public ,var        子类中:public,protected ,var        本类中:private,protected,public ,var        如果不使用这三个关键词,也可以使用var关键字。但是var不可以跟权限修饰词一起使用。var定义的变量,子类中可以访问到,类外也可以访问到,相当于public        类前面:只能加final,abstract        属性前面:必须有访问修饰符(private,protected,public,var)        方法前面:static,final,private,protected,public ,abstract   68. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用?        $this 当前对象   self  当前类   parent  当前类的父类        $this在当前类中使用,使用->调用属性和方法。        self也在当前类中使用,不过需要使用::调用。    parent在类中使用。   69.类中如何定义常量、如何类中调用常量、如何在类外调用常量。        类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。        定义常量使用关键字const.        例如:const PI = 3.1415326;        无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,        访问常量的格式都是类名加作用域操作符号(双冒号)来调用。        即:类名 :: 类常量名;   70. 作用域操作符::如何使用?都在哪些场合下使用?        调用类常量   调用静态方法   71. 什么是魔术方法?常用的魔术方法有哪几个?        以__开头的系统自定义的方法。        __construct()  __destruct()   __autoload()   __call()    __tostring()   72. 什么是构造方法和析构方法?        构造方法就是在实例化一个对象的同时自动执行的成员方法,作用就是初始化对象。        php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()就是构造方法。如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数,没有任何操作。        构造方法的格式如下:        function __construct(){}        或者:function 类名(){}        构造方法可以没有参数,也可以有多个参数。        析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。        析构方法的定义方法为:__destruct();        因为php具有垃圾回收机制,能自动清除不再使用的对象,释放内存,一般情况下可以不手动创建析构方法。   73. __autoload()方法的工作原理是什么?        使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。        当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时. 就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。   74. 什么是抽象类和接口?抽象类和接口有什么不同和相似的地方?        抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。        抽象类是通过关键字 abstract 来声明的。        抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,        抽象方法没有方法体,该方法天生就是要被子类重写的。        抽象方法的格式为:abstract function abstractMethod();                   因为php中只支持单继承,如果想实现多重继承,就要使用接口。也就是说子类可以实现多个接口。接口类是通过interface关键字来声明的,接口类中的成员变量和方法都是public的,方法可以不写关键字public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。子类继承抽象类使用extends,子类实现接口使用implements。        抽象类至少有一个抽象方法吗??????        答:如果一个类声明成抽象类,里面可以没有抽象方法            如果一个类中有抽象方法,这个类必须是抽象类   75. __call的参数有几个,类型是什么,意义是什么?        魔术方法__call()的作用是当程序调用一个不存在或不可见的成员方法时,php会先调用__call()方法,将那个不存在的方法的方法名和参数都存储下来。        __call()包含两个参数,  第一个参数是那个不存在的方法的方法名,是个字符串类型;                             第二个参数是那个不存在的方法的所有参数,是个数组类型。        本人认为__call()方法的意义更多在于调试,可以定位到错误。同时可以捕捉异常,如果某个方法不存在,则执行其它可替代方法。   76. smarty模板技术的用途是什么?        为了php与html分开,美工和程序员各司其职,互不干扰。   77. smarty配置主要有哪几项?        1. 引入smarty.class.php;        2. 实例化smarty对象;        3. 重新修改默认的模板路径;        4. 重新修改默认的编译后文件的路径;        5. 重新修改默认的配置文件的路径;        6. 重新修改默认的cache的路径。        7. 可以设置是否开启cache。        8. 可以设置左侧和右侧定界符。   78. smarty在使用过程中需要注意哪些细节?        Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,也就是说smarty技术将用户UI与php代码分离开。这样程序员和美工各司其职,互不干扰。        smarty运用过程中要注意以下几个问题:        1.正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;        2.php页面中使用assign赋值 和 display显示页面;        3.smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。               A.{}               B. foreach               C. if else               D. include               E. literal   79. MVC的概念是什么?各层主要做什么工作?        MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。        M指Model模型层,V是View视图层(显示层或者用户界面),C是Controller控制器层。        使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。        在网站开发中,        模型层一般负责对数据库表信息进行增删改查,        视图层负责显示页面内容,        控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,        执行完毕后由控制器层决定将结果assign到哪个view层。   81. java语言中方法重写和重载分别代表什么意思?准确说php支持方法的重载吗?很多参考书中提到的php重载实际上该如何正确理解?        答:        php不支持方法的重载,很多书里提到的PHP‘重载’应该是‘重写’   82. final关键字能定义类中的成员属性吗?        答:不能,类的成员属性只能有public ,private , protected ,var 来定义   83. final关键字定义的类能够被继承吗?        答:final定义的类不能被继承   84. 说说static关键字的使用场合?static能用在class前吗?     static可以跟public,protected,private一起使用吗?构造方法可以是static的吗?        答:       static可以在属性和方法前面使用,调用static属性或者方法时,只要将类载入就可用,不用实例化               static不能用在class的前面                   static可以跟public,protected,private一起使用,在方法的前面;               ▲构造方法不能是static   85. 接口可以实例化吗?抽象类能实例化吗?        答:接口和抽象类都不能被实例化   86. class前面能加访问修饰符吗?如果能加,只能是哪几个访问修饰符?可以是权限访问修饰符public,protected,private吗?        答:class前面可以加final,static;        class前面不能加public,protected,private   87. 类中属性前可以不加访问修饰符吗?成员变量前的修饰符只能是public,protected,private吗?还可以是哪几个?        答:类中的属性必须加修饰符,除了那3个以外,还可以加var   88. 如果echo一个数组,页面输出什么?echo一个对象呢?print一个数组或者对象呢?        答:页面只能输出“Array”;echo一个对象会出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php on line 33”            print一个数组时也只是输出“Array”,print一个对象出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php ”            ▲print和echo是一样的             89. __tostring()魔术方法在什么时候被自动执行? __tostring()魔术方法必须要return返回值吗?        当echo或者print一个对象时,就是自动触发。而且__tostring()必须要返回一个值        90. 什么是抽象方法?        答:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有   91. 如果一个类中有一个方法是抽象方法,而这个类没有定义成抽象类,会报错吗?           答:会,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"   92. 如果一个类是抽象类,而类中的方法都是非抽象的方法,会报错吗?        答:不会报错,如果一个类是抽象类,其中可以没有抽象方法,但是一个类中有个方法是抽象方法,那么这个类一定是一个抽象类   94. final 关键字的应用应注意的问题?          使用final关键字定义的类,禁止继承。        使用final关键字定义的方法,禁止重写。   95. 如果一个类既要继承一个父类,又要实现多个接口,该如何写?        书写格式例如: class MaleHuman extends Human implements Animal,Life { ... }   96. 什么是单点入口呢?         所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,         比如说在上面我们就使用index.php作为程序的单点入口,当然这个是可以由你自己任意控制的。        单点入口有几大好处:            第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面            第二、程序的架构更加清晰明了。   97. PHP提供了2套正则表达式函数库,分别是哪两套?【        (1) PCRE   Perl兼容正则表达式         preg_   为前缀        (2) POSIX  便携式的操作系统接口       ereg_   为前缀   98. 正则表达式的组成?     由原子(普通字符,如英文字符)、     元字符(有特殊功用的字符)     模式修正字符     一个正则表达式中,至少包含一个原子   99. 不常用魔术方法的触发时机?        __isset()  __unset()的触发时机        __sleep()、 __wakeup()  在对对象进行串行化的时候调用        如果序列化对象的时候,不写__sleep()方法,则所有的成员属性都会被序列化,而定义了__sleep()方法,则只序列化指定数组中的变量。因此,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。        使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。        使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。               101.常见框架        thinkPHP  yii  ZendFramework  CakePhp  sy   102. 常用魔术方法的触发时机?        1)__autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行__autoload()。程序希望通过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。__autoload()方法的工作原理是什么?当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。        2)__construct()  :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果有参数,那么new这个对象的时候要记得写上相应的参数。在php5以前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。如果一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起作用,普通构造方法不起作用。反之,在php5以前版本中,不认识魔术构造方法,只是把该方法当做普通的方法。        3)__destruct()  :这个是魔术析构方法。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。析构方法没有参数。        4)__call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行__call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。        5)__get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行__get()。它有一个参数,表示要调用的属性的名称。        6)__set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行__set()。它包含两个参数,分别表示属性名称和属性值。        7)__tostring()  :当程序使用echo或print输出对象时,会自动调用该方法。目的是希望通过该方法将对象转化为字符串,再输出。__tostring() 无参数,但是该方法必须有返回值。        8)__clone()  :当程序clone一个对象的时候,能触发__clone()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。   103. MVC的概念是什么?        MVC(即模型-视图-控制器)是80年代发明的一种软件设计模式或者说编程思想。        M指模型层,V是指视图层(显示层或者用户界面),C是指控制层。        使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。        C存在的目的则是在M和V之间起到调节作用,确保M和V的同步,一旦M改变,V应该能同步更新。        将M和V分离,就可以做到同一个网页,在不同节日到来的时候能显示不同的页面风格,这只需要提前制作多个视图层模板页面,        而无需更改M层程序。        MVC做到了编程中的分工合作,代码的可重用性得到最大化体现,程序逻辑更加清晰而富有条理,便于后期维护管理。   104、     访问权限修饰符有哪几种,对比解释        答:1、public 表示公共的,在本类中和子类中以及类外,可以对其调用        2、protected表示受保护的,可以在本类中和子类中调用        3、private表示私有的,只能在本类中调用        4、var,效果等同于public 105、     Class关键词前可以有哪些修饰词        a)    Final修饰,表示该类是最终的,无法继承        b)    Abstract修饰,表示该类是抽象类   106、     作用域操作符在那些场合下使用        答:作用于操作符的使用场合        a)    本类中:               i.     self::类常量               ii.     self::静态属性               iii.    self::方法()   parent::方法()        b)    子类中:               i.     parent::类常量               ii.     parent::静态属性(public或者protected)               iii.    parent::方法()(public或者protected)        c)    类外:               i.     类名::类常量               ii.     类名::静态属性(public)               iii.    类名::静态方法(public)   107、     $this,self, parent分别代表什么?哪些场合下使用        答:$this代表的是当前对象  self代表的是当前的类  parent代表的是当前类的父类        使用场合:        $this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法;        self只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;        parent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法。   108、     说明是接口、抽象类二者有何相同和不同的地方?        1、接口是帮助php实现功能意义上的多继承的,用interface来声明,其方法没有方法体,使用implemens关键词来实现接口。        接口中只能包含抽象方法和类常量,不可以包含成员属性。        2、抽象类是一种不能被实例化的类,只能作父类,用abstract class来定义,抽象类和普通类可以没有区别,类中可以包含成员属性、类常量、方法。        子类得用extends来继承,而且只能是单继承。        两者相同点是都不可以被实例化,都是需要被继承才可以使用。        两者的最大区别是接口可以实现多继承,而抽象类只能是单继承。        接口中不能包含成员属性,而抽象类中可以有成员属性。        接口中的抽象方法必须是public或者无访问修饰词,接口中的抽象方法不能用abstract来修饰。        抽象类中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract来修饰。   109、     解释PHP中单例模式?        又叫做单态模式、单元素模式、singleton pattern。单例模式指在PHP的应用程序的范围内只对指定的类创建一个实例。使用单例模式的类称为单例类。在php中单例类必须要有一个私有的构造方法,还要有一个私有的魔术克隆方法(该方法体中为空)和一个私有的静态的成员属性$_instance.私有构造方法防止除自身以外的类来实例化它。私有的方法体为空的克隆方法防止该类被克隆。$_instance用来存储被自身实例化后的对象。还必须要有一个公共的静态的方法getInstance()。该方法返回已经存储了实例对象的$_instance。   单例:一个类至始至终只能实例化一个对象,这样的类就是单例类 单例类的优点:① 节省空间 ② 节省资源 实现单例类的四个要点:①私有的构造函数②私有的__clone的方法③私有的静态属性,属性有以保存类的实例④公共的静态方法来实例化对象 无限级分类:         ①数据库设计:region_id(自增ID) region_name(地区名称) parent-id(上级地区id) region_path(全路径)        ②程序设计:全路径的作用:a根据全路径顺序取数据 b用作信息层级显示    110、   什么是SQL注入?        SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,        没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,        程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,        成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。   111、   如何防止SQL注入?        要对提交的信息进行过滤,对单引号进行转义。        首先可以在php.ini中设置,让所有的单引号在提交后都进行转义。或者使用addslashes().   112、     FCKEditor自动过滤的解决办法?        如果您需要编辑模板页,默认的FCK设置是会去掉<HTML></HTML><BODY></BODY>标签,而且会给你加上<P></P>标签的,如果需要保留的话,只要更改下设置可以了。        在fckconfig.js里面有:FCKConfig.FullPage = false ;        改为:FCKConfig.FullPage = true;        如果想去掉自动添加<P>的代码就可以在这里设置        默认是        FCKConfig.EnterMode = 'p' ;    // p | div | br        FCKConfig.ShiftEnterMode = 'br' ; // p | div | br        改成        FCKConfig.EnterMode = 'br' ;    // p | div | br        FCKConfig.ShiftEnterMode = 'p' ; // p | div | br   113、     $_REQUEST、$_GET、$_POST、$_COOKIE 的关系和区别:            1.关系:$_REQUEST包含了$_GET、$_POST、$_COOKIE等的所有内容,是它们的集合体。        2.通过$_REQUEST获取变量值,PHP页面因为不确定它是哪种传值方式,        因此会根据php.ini中的配置来接收值。        php.ini里可以设置,variables_order = “GPC”。其含义是GET,POST,COOKIE.        所以PHP页面会先从$_GET中获取,再从$_POST中获取,然后从$_COOKIE中获取。        新获得的值会覆盖之前获取到的值。        因此从表现形式上看,$_REQUEST最后是获取$_COOKIE中的值,如果$_COOKIE中没有值,        会获取$_POST中的值,如果$_POST没有获取到 ,就去$_GET中获取。        如果$_GET中也没有该值,那么$_REQUEST就返回null。               114、     什么是多条件查询(复合查询),如何实现多条件查询?        如何实现万能查询呢?查询的时候要填写查询条件,这些条件会通过表单进行提交。        首先需要检查提交的条件是否为空。如果不为空,就认为这个值是要被当作条件,        我们就可以使用字符串连接的方式来组合一个sql查询语句。        当执行后获取查询结果。   115.       文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?        1). 首现要在php.ini中开启文件上传;        2). 在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改;        3). 上传表单一定要记住在form标签中写上enctype="multipart/form-data";        4). 提交方式 method 必须是 post;        5). 设定 type="file" 的表单控件,并且必须具有name属性值;        6). 为了上传成功,必须保证上传文件的大小是否超标、文件类型是否符合要求,上传后存放的路径是否存在;        7). 表单提交到接收页面,接收页面使用$_FILES来接收上传的文件。$_FILES是个多维数组。第一维下标是上传控件的name,二维下标分别为name/type/tmp_name/size/error。分别代表文件名、文件类型、上传到临时目录下的临时文件名、文件大小、是否有错误。如果是批量上传,那么二维下标就是数组,而并非是字符串。        8). 文件上传后是被放置在服务器端临时路径下,需要使用move_uploaded_file ()函数,才可以将上传后的文件保存到指定目录。        9). 为了避免上传文件重名,可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名。   116.      使用GD2库创建图像的步骤?        1). 创建一个画布:imagecreate();        2). 设置画布背景颜色,使用RGB设置颜色:imagecolorallocate();        3). 设置文字颜色:imagecolorallocate();        4). 在画布上书写文字:imagestring();        5).  以 JPEG 格式将图像输出到浏览器或文件:【根据图片格式不同,函数还可以是imagepng()、imagegif()等】   imagejpeg();        6). 清除图像资源:imagedestroy();   117.      GD2库生成缩略图的步骤是什么?        1). 读取希望生成缩略图的源图像,创建图像对象:【根据图片格式不同,函数也相应不同】               $src_image = imagecreatefromjpeg();        2). 获取原图像的宽度和高度$srcW,$srcH,根据缩放比例计算出新图像的宽度和高度$dstW、$dstH:        3). 创建一个真色彩的图像对象,宽度和高度设置成刚才计算出的宽度和高度:               $dst_image = imagecreatetruecolor($dstW,$dstH);        4). 拷贝图像并调整大小:   imagecopyresized();        5). 将图像输出:【根据图片格式不同,函数也相应不同】  imagejpeg();        6). 清除图像资源(将源图像资源和目标图像资源都清除)   imagedestroy();   118.      GD2库给图片增加水印如何做?        1. 添加简单的文本水印:               利用imagestring()函数就可以在图片上写文本水印。        2. 增加一个图形水印:               1). 读取希望增加水印的源图片,创建图像对象:【根据图片格式不同,函数也相应不同】                      $image = imagecreatefromjpeg();               2). 创建一个水印图片的图像对象:                      $watermark = imagecreatefrompng();               3). 拷贝并合并图像:                      imagecopymerge();               4). 将图像输出:【根据图片格式不同,函数也相应不同】                      imagejpeg();               5). 清除图像资源(将源图像资源和水印图像资源都清除)                      imagedestroy();   119.      什么是事务?什么是回滚?事务的作用是什么?        事务就是组合起来的几个独立的sql操作。如果其中一项失败,那么就让这几个组合起来的sql操作都回退到未执行状态。这就是事务的回滚。mysql中MyISAM存储引擎的表不支持事务,只有InnoDB 存储引擎的表才支持事务,为了让事务正常执行,就需要让参与事务的所有数据表都设置成innoDB类型。事务被包装在了 BEGIN 和COMMIT 语句之间。在没有使用 COMMIT 语句的情况下,对数据库的操作不是永久的,一旦运行了ROLLBACK,就会被回退。只有执行了COMMIT,数据表中的信息才被改动。事务的目的就是为了保证数据的完整性。   120.      模拟SESSION机制实现数据库存放会话数据有什么作用?【备用】       如果使用默认的SESSION机制,大家都知道默认的SESSION_ID是存放在COOKIE中,用户的身份是靠SESSION_ID来识别的,而COOKIE文件是存放在用户浏览器的客户端,这样就会带来一个问题,当用户在办公室选择一些商品到购物车,在准备下订单付款的时候,用户选择了支付宝在线的支付方式,恰巧办公室的电脑上面没有安装支付宝的数字证书,而在用户家里的电脑安装过数字证书,所以呢,用户就需要回家去支付。但是回家登录商城之后,发现购物车中精心挑选的商品都不存在了。这是为什么呢?问题就在家里电脑上的并没有存放SESSION_ID的cookie文件,因而就无法正确的读取服务器上对应session文件中的数据,所以无法将原来的选择的商品息读取过来。这样的购物车功能给用户的用户体验式非常糟糕的,所以我们就需要采取模拟SESSION机制使用数据库来存放会话数据。   121.       什么是无限极分类?        要实现无限极分类,数据库建表是关键。        表结构中至少需要三个字段,如果想避免递归循环,那么需要四个字段。        1. id ,当前数据的唯一标识;        2. typename ,类型名称;        3. parentid , 当前类型的上一层父类型的id;        4. path , 其中存储当前类型的id和它所有父级类型的id。        这些id之间采用“-”隔开。        5. 当通过以下sql语句就可以实现,相同顶级类下的信息都在一起集中显示。        select * from 表名 where 条件 order by path; 无限极分类的原理是什么?        要实现无限极分类,数据库表结构是关键。        表结构中至少需要三个字段,如果想避免递归循环,那么需要四个字段。        1. id ,当前数据的唯一标识;        2. typename ,类型名称;        3. parentid , 当前类型的上一层父类型的id;        4. path , 其中存储当前类型的id和它所有父级类型的id。        这些id之间采用“-”隔开。        5. 当通过以下sql语句就可以实现,相同顶级类下的信息都在一起集中显示。         select * from 表名 where 条件 order by path;   122.    分页原理是什么?        数据分页需要以下几个条件:        1. 参与分页的总条数 【$msg_count】 ,该值通过数据库查询可以获取到;        2. 每页显示的条数【$pagesize】 ,这个数值由自己定义;        3. 当前页的页码数 【$page】,该数值通过地址栏传递和接收;        4. 可以通过以上资料计算出总页数 【$pagecount】 ,此处需要借助ceil();               【$pagecount = ceil($msg_count/$pagesize);】        5. 数据库查询借助sql语句中的【limit】来实现数据的变化:               例如:               select * from 表名 where 条件 limit $startnum , $pagesize;               而$startnum = ($page-1)*$pagesize;   123、   如何在smarty模板语言中使用php代码?        借助于两个smarty内建函数。        1. inluce_php 函数用于在模板中包含 php 脚本。例如:        {include_php file="test.php"}        2. php 标签允许在模板中直接嵌入 php 脚本。例如:        {php}               echo "这个是php内建函数的作用";        {/php}        124、   请列出至少五个smarty中的变量调节符并说明功能?        default  例如:{$arr|default:’xxxx’} ,默认变量调节器,当变量为空时显示给定的默认值        truncate   例如:{$articleTitle|truncate:10} , 切割字符串长度为指定的长度;        count_characters   例如:{$articleTitle|count_characters} ,获取字符串长度;        strip_tags   例如:  {$articleTitle|strip_tags} ,去除字符串中的所有html标签;        date_format  例如:{$smarty.now|date_format(‘’)} ,格式化时间戳。   125、   写程序实现如下功能:       a.如何判断一个字符串中是否存在一个字符?        echo strstr('abcdefgcd'  , 'cd');        echo strpos('ab0defgcd'  , 'cd');       b.如何判断一个字符串中一个字符出现的次数?        echo substr_count('abcdefgcd'  , 'cd');       c.如何去掉一个字符串的最后一个字符        echo substr('abcdefgcd'  , 0 ,  -1);   126、     如何使用smarty的缓存、步骤?什么叫单模板多缓存?        如果给整个网站开启缓存,那么$smarty->caching=1,此时缓存的时间为smarty.class.php中默认的时间,也就是3600秒。如果对每一个页面独立设置缓存,那么$smarty->caching=2 ,缓存时间就会跟display的参数模板页相挂钩,也就是可以实现对每个模板页设置不同的缓存时间。        用法例如:        if(!$smarty->is_cached('index.html')) {               //此处可以执行数据库操作               $smarty->cache_lifetime = 3600*6;        }        $smarty->display('index.html');               对于例如新闻单条这样的页面,新闻的模板都是一个,如果开启缓存,那么所有的新闻单页的缓存都是一个,根本不会随着id的变化而变换内容。所以为了区分不同的页面缓存,需要使用单模板多缓存技术。具体做法是以id作为display的第二个参数来实现。此外对于具有分页的列表页,也必须在display中使用第二个参数,可以使用新闻类型id和当前页面合并成第二个参数。   127、   写一个递归函数完成以下功能:向函数中传一个多维数组,对数组中所有的值做判断        ,如果值是’number’则设置该值为0?(提示:该题考的是递归的应用,因为传入的数组不确定是多少维的,所以需要递归判断)          function recursive_array($arr) {               if(is_array($arr)) {                      foreach($arr as $key=>$value) {                             if(is_array($value)) {                                    $arr[$key] = recursive_array($value);                             } else {                                    if($value=='number') {                                           $arr[$key] = '0';                                }                             }}}               return $arr;        }          128、   使用jquery写一个全选的例子?        //全选与取消全选        function selectAll(flag) {               for(var i=0; i<$("#fonds input").size(); i++) {                      $("#fonds input").get(i).checked=flag;               }}        //判断复选框已经被勾选了多少个?        function checkFonds() {               var count=0;               for(var i=0; i<$("#fonds input").size(); i++) {                      if($("#fonds input").get(i).checked==true) {                             count++;                      }}               alert(count);        }        //利用后代选择器和get()来获取指定的控件        $(“div a”).get(2)   129、     请说明smarty中fetch方法的功能?        Fetch方法可以获取到页面所有的内容,并且赋值到一个变量中。        如果第四个参数为true,则等同于display,直接输出到浏览器中。        如果第四个参数为false,则不输出。        Display方法就是第四个参数为true的fetch方法。        Display = Fetch() + echo()   130、   写出关于文件上传的相关函数?                    strrchr($filename , '.');      explode('.' , $filename);        end($arr);                     strrpos($filename , '.');        substr($filename , $pos+1);    pathinfo($filename , PATHINFO_EXTENSION);        date(‘YmdHis’)               time()      rand();        mt_rand()                      move_uploaded_file()   131、   如何将SESSION存放在数据库中,可以结合数据表设计说明.        默认情况下php.ini中session.save_handler = files,也就是session是以文件形 式存储的。        如果想更改为数据库或其它存储方式,那么需要更改设置,让 session.save_handler = user。        除了在php.ini中配置外,还可以在PHP页面中单独配置,用        ini_set ('session.save_handler, 'user')来设置session的存储方式,设置为用户自定义存储方式。        设置好存储方式后,需要使用session_set_save_handler()函数。        该函数是设置用户级别的session保存过程的函数。该函数有6个参数,这6个参数其实是6个自定义函数的名称,分别代表对session的开启,关闭,读,写 ,销毁,gc(垃圾回收)。        示例代码如下:        function open () { }        function close() { }        function read () { }        function write () {}        function destroy () {}        function gc () {}        session_set_save_handler ("open", "close", "read", "write", "destroy",  "gc");        session_start();        现在你就可以象往常一样地使用session了。        数据库结构如下:        Session_id , session_value ,expire_time , 分别存储sessionid的id和值以及失效时间。   132、    常用的正则表达式写法:        中文:/^[\u4E00-\u9FA5]+$/        手机号码:/^(86)?0?1\d{10}$/        EMAIL:        /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/        密码(安全级别中):        /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/        密码(安全级别高):        /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/ ——————————————————————————                     PHP初     —————————————————————————— order顺序 var(variables)变量 model典型 样式 模型 module模数;模块;组件 enctype SEO搜索引擎优化(Search Engine Optimization) Search搜索 Engine 引擎 Optimization最佳化,最优化 mod_rewrite模块重写 CMS 内容管理系统(content manage system) electronic commerce(电子商务) gc(garbage collection)垃圾回收   ---------------Apache与WAMP安装--------------- 1.wamp安装 apache (2.2版本) mysql(5.067版本)  php(5.2版本)   LAMP  Linux下的安装 负责版本控制 SVN 一台机器能安装多个apache服务 但是只能安装一个MySQL服务 -------------PHP上------------- PHP: personal home page  个人家庭主页  94年产生的 5.2.6版本 ASP: active  server page   93 JSP: java server page   类里面定义常量叫类常量 用const定义 类常量必须有初始值 define('','','false/true')里有三个参数,默认为false时区分大小写,反之不区分大小写 在类里面叫做方法  在类外叫做函数 常量默认为大小写敏感。 ::作用域操作符   标量和非标量类型的区别:标量只能存一个数据,非标量能存多个数据 (属性  变量名  类常量)区分大小写 (变量  类名  系统自带函数  自定义函数)不区分大小写  当$_POST['user_name']等没加‘’是会先当作常量来编译 3.函数 可变函数:函数的名字是一个变量 可选参数:参数有默认值 递归(recursive)函数体内有一个循环体,自己调用自己,但他跟死循环有区别,死循环是没有尽头的,     他是无限循环,递归有尽头,他最终会获得一个值 function pager( $page $msg_count $pagesize $url="?"){ }----》$url="?"即为可选参数     数组的合并 array_merge()              $arr1+$arr2 两数组相加: 只要是具有相同的下标,则只保留首次出现的元素,后者舍去 array_merge:索引数组会将后者的元素附加到前者后面;若是关联数组,相同下标,后者覆盖前者    explode() 取数组最后一个元素 8.文件的操作    mkdir新建目录    rmdir删除目录    skandir输出指定路径下的文件或目录    fopen(资源)— 打开文件或者 URL    fclose— 关闭一个已打开的文件    fgets — 一次读取一行    fgetc — 一次只读取一个字符    fgetss — 一次读取一行并过滤掉 HTML 标记    file_get_contents — 将整个文件读入一个字符串    fread-读取文件    file_put_contents— 将一个字符串写入文件    fwrite-写入文件    unlink-删除文件    pathinfo — 返回文件路径的信息 array_push — 将一个或多个单元压入数组的末尾(入栈) array_unshift — 在数组开头插入一个或多个单元 9.其它函数    输出控制函数:ob(output buffer) ob_flush    加密函数 md5    数学类函数:abs绝对值,rand随机数,ceil取整,floor,mt_rand生成更好的随机数    转换函数:explode 使用一个字符串分割另一个字符串,implode    时间函数:date(),strtotime (将字符串转换为时间戳)    处理地址栏: url_encode url_decode 10.乱码问题    ASCII(American Standard Code for Information Interchange)81年产生    ANSI 美国国家标准学会( American National Standards Institute)    utf-8(-8代表一次传输8个字符)可变字节编码(中文3个字节)(utf:Unicode转换格式(UCS Transformation Format)      utf-16(-16代表一次传输16个字符)    GBK. 国家标准扩展码(Guo-Biao Kuozhan)90年产生(双字节编码)    GB2312 因为国际排行2312位(81年产生)    BIG5    unicode (国际编码)可变字节编码    Latin_1    utf-8+ bom    ISO:国际标准化组织(International Standardization Organization)   11.数据库操作    数据库优化:char(查询速度快)               varchar        引擎:myisam(mysql indexed sequential access method)索引顺序访问方法        支持事务的引擎:BDB ,innodb        innodb:是以inno开头的一家公司的商标   表类型就是表的存储引擎     dll:动态数据连接库  封装的类库   修饰符:public,var,protected,private,static,final,abstract 访问权限修饰符:public,private,protected        public:类成员访问没有限制,多有外部成员都可以访问        protected:受保护的,不能被类外部成员访问,该类的直接子类可以访问,可以实现对成员属性的读、写操作        private:私有的,只能类里边的成员自己访问,类外部的成员都不能访问        一个属性被修饰为私有的(private),那么这个属性在类的外部是不可以读取和修改的,现在有一种方法 可以设置该属性既是私有的,还可以被类的外部成员读取即__get()和__set()    修饰class的修饰符:final,abstract(抽象) final被它修饰的类是不能被继承的 定义属性必须要加修饰符:可以是public和var 定义方法时可以有修饰符public,可以不写,默认为public   如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。 final只能出现在class类和方法中   方法前可以有public,private,protected,static,final,abstract修饰。     继承性:耦合性越低越好  const修饰,一定要有初始值 ( smarty的保留变量:{$smarty.now},{$smarty.const},{$smarty.post},{$smarty.get},{$smarty.cookies},{$smarty.config},{$smarty.session},){$smarty.capture}  调用属性时,如果前有$后边就不能有,后有前不能有,如:$this->abc                                               self::$abc 当用parent调用父类方法时,将方法自动转化为静态的   多态性:由继承  重写(覆盖)(重新写一遍)(override重写)造成的             php不支持重载(重复载入),php为弱变量语言(overload重载)   抽象:一个类包含抽象方法就是抽象类,抽象类中不一定有抽象方法 抽象类的定义abstract 接口里可以有抽象类,还可以有类常量,通过interface来定义一个接口, 实现多个接口时,接口中的方法不能有重名。 接口中定义的所有方法都必须是public,这是接口的特性。 接口里的方法必须被重写 静态:static 不能与构造方法共存,static不能new对象,构造方法可以new对象,方法体中不能用$this   在php5以前的版本中,当普通构造方法和__construct(魔术方法)共存在时,它会调用普通构造方法,它对__construct(魔术方法)是不识别的,在php5以后的版本中,当共存时他会先调用__construct(魔术方法)。析构方法是最后被执行的,被自动调用的方法 单例(单态)singleton ——————————————————————————                     PHP中     —————————————————————————— 2.jQuery   包括javascript框架和prototype.js框架 选择器:   1.基本选择器:     ①、$('#result')=jQuery('#result')=document.getElementById('result')                            <div id='result'>                         <div class='result'>    ②、class选择器 $('.result')    ③、元素选择器$('div')   2.子代选择器:$('#myform < input')   3.后代选择器:$('#myform  input')   4.组合选择器:$('#myform < span < input') 3.Ajax  ajax的用处是用来异步js和xml 不仅可以获取xml数据,还可获得hmtl和json数据    ajax的优点:1.提升用户的体验2.占用带宽小3.减小服务器的负载    ajax就是把B页面的内容,显示到A页面的指定位置,实现异步传输    $.ajax() 返回其创建的 XMLHttpRequest 对象。    $.ajax({     url:,  data:,  type:,  datatype:,  success:function(这个参数里,存在被传回的页面的所有内容){}   });   $.post('请求地址','传递参数','回调函数');   $.get('请求地址','传递参数','回调函数'); post传值文件没有大小限制,保密性好,必须有form表单 get传值安全性不高,有大小限制 当地址栏里有中文时,用urlencode(编码 URL 字符串) urlencode — 编码 URL 字符串 urldecode(解码已编码的 URL 字符串)   4.会话控制         session:unset()和array() 是连同内存和session文件内容一起删除,而session_destroy只是将文件删除    cookie没有生命周期的叫会话cookie,随着浏览器的关闭,cookie消失    cookie有两种存在方式,一种是以文件形式存在,另一种是保存在内存里    cookie里面只能存字符串   会话控制主要是为了跨页面传值 序列化是把其他的类型转换成字符串类型 5.smarty 代码重用(include,require,include_once,require_once) include require 比 require_once include_once 性能高  加载类文件用 require_once(最好) include_once   6.PDO    dsn(data source name)    //数据源    $dsn = 'mysql:host=127.0.0.1;dbname=java1008a'; die('到此结束'); 等同于 echo '到此结束';die;   ----------------------------------------------------------------------------------   2.b/s与c/s简单比较,区别: --a、运行环境不同(广域网、局域网) --b、安全级别不同(低/高) --c、用户群不同(全部用户/局部用户) --d、系统升级不同(无缝升级/整体升级) --e、用户开启不同(浏览器/特制软件) --f、软件界面特点不同(信息流/用户体验)   比如:b/s就是网上的微博、博客;c/s就是在网吧打的网络游戏(奇迹、传奇等) 3.php是什么:运行在服务器端的脚本语言 --Hypertext Preprocessor --personal home page 4.php语言能做什么 --图形化用户界面程序 --服务器端运行脚本程序   3.php外部变量$_POST[]、$_GET[];     特殊运算符   '.'是连接符   ".="是连接赋值   "@"屏蔽错误信息  $link=@mySQl_connect(主机,用户名,密码) 5.流程控制(顺序、选择、循环) ****************************************************************************** ****************************************************************************** 第三单元【字符串】 1.字符串的三种定义方式(单引号、双引号、定界符) ---单引号定义(转义\'和\\) ---双引号定义(转义\n \r \t \$ \\ \") ---定界符方法<<<eof   2.函数部分 explode/implode substr()** str_replace/trim/ltrim/rtrim   strstr(str, search)获得指定字符串最开始出现到最后的内容 strrchr(str, search)获得指定字符串最后出现到最后的内容 strpos(str,  search)获得指定字符串最开始出现的位置 strrpos(str, search)获得指定字符串最后出现的位置 ucfirst(str)将字符串第一个字母大写 ucwords(str)将字符串的每个单词的第一个字母大写 strlen(str)获得字符串长度 strcmp(str1, str2)比较两个字符串大小,                 返回负数表示 str1 小于 str2;                 返回正数表示 str1 大于 str2;                 返回零表示二字符串相同   urlencode(str)替换所有非字母数字的字符,变为%后面跟两位16进制数,空格变为+号 urldecode(str)对已%##编码的URL进行解析还原 parse_url(str)解析完整的url转变为为数组 parse_str(str,out)解析请求字符串转变为数组 htmlspecialchars()转换html代码为实体代码 printf/sprintf %b %d %c %x %s %f %X –    b           整数转成二进位。 –    c            整数转成对应的 ASCII 字符。 –    d           整数转成十进位。 –    f            单倍精确度数字转成浮点数。 –    o           整数转成八进位。 –    s            转成字符串。 –    x            整数转成小写十六进位。 –    X           整数转成大写十六进位。   1.数组和栈的操作   array_push(目标数组,字符串)将字符串压入数组的最后   array_pop(目标数组)将数组最后的元素弹出并返回 2.数组和队列的操作   array_unshift(目标数组,字符串)将字符串放到数组的开始位置   array_shift(目标数组)删除数组的第一个元素并返回 3.数组和指针的操作key() current() next() prev() reset() end() 4.预定义数组($_GET $_POST $_FILES $_COOKIE $_SESSION) ****************************************************************************** ****************************************************************************** 第六单元【其他常用函数】 date(format,[timestamp])//格式化时间信息,并返回 time()//返回当前时间戳信息   mktime(hour,minute,second,month,day,year) mktime(小时,分钟,秒,月,天,年)//取得一个日期的 Unix 时间戳   max()//取得最大值 -echo max(1, 3, 5, 6, 7);  // 7 -echo max(array(2, 4, 5)); // 5 -echo max(0, '1hello');     // 1hello -echo max('hello', 0);     // hello -echo max(-1, 'hello');    // hello -echo max(array(2, 4, 8), array(2, 5, 7)); // array(2, 5, 7) -echo max('string', array(2, 5, 7), 42);   // array(2, 5, 7)数组和非数组比较数组总认为最大   mt_rand(65,94)//获得随机数 round()//四舍五入取整 flush()//输出准备区内容 urlencode('张三')//返回字符串中,除了-_.之外的所有非字母数字部分为%后接两位 16进制数,空格转化为+ urldecode()//对已经编码的部分反编码 var_dump()//输出变量的详细信息(八种数据类型数据都可以输出)   chr(mt_rand(65,94))随机获得字母 ord(chr(mt_rand(65,94)))将字母转化为数字 basename(路径名)获得路径中文件名部分 strtolower转换小写   第七单元【php连接mysql】 *mysql_connect(主机,用户名,密码) 打开一个到 MySQL 服务器的连接 *mysql_select_db(数据库,连接数据库资源) 选择 MySQL 数据库 *mysql_query("set names utf8");设定字符集          *mysql_close() 关闭 MySQL 链接 *mysql_query(语句) 发送并执行一条sql语句 mysql_fetch_row(结果资源)从结果集中取得一行结果(索引数组) mysql_fetch_assoc(结果资源)从结果集中取得一行结果(关联数组) *mysql_fetch_array(结果资源)从结果集中取得一行结果(索引/关联数组) mysql_fetch_object(结果资源)从结果集中取得一行结果(对象数组)   mysql_errno()返回错误号码 *mysql_error()返回错误信息 *mysql_num_rows(结果资源)用于计算查询结果中所得行的数目 *mysql_affected_rows()获得受影响的结果数目 *mysql_insert_id()传回最后一次使用 INSERT 指令产生的自动增长 ID 值   mysql_result(结果集,索引行,字段)指定获取结果 mysql_free_result(结果资源)释放结果集 mysql_num_fields(结果资源)用于计算查询结果中所得列的数目 mysql_fetch_field(结果资源)从结果集中取得列的结果,以对象形式返回 mysql_pconnect()永久连接数据库   1.留言板建立数据库bbs,建立两张表leave_word和back_word(留言表和回复表)   leave_word:   字段       数据类型   id        int         主键、自增   title     varchar(20) 标题   content   text        内容   itime     datetime    添加时间     back_word:   id        int         主键、自增   leave_id  int         外键(留言id)   content   text        内容   btime     datetime    回复时间 4.删除留言,对无效、无用的留言实现删除功能(这时需要用get方式传递被删除留言id值) 5.修改留言,对需要修改(get方式传递被删除留言id值,再利用隐藏域方式传递给接收页面) 6.留言详细显示功能,有的留言内容比较多,在明细页面不可能全部显示出来(这时利用get方式传递留言id) 7.在详细页面可以实现回复功能和回复留言展示,步骤:制作一个回复表单和接收数据页面        3.构造方法和析构方法        构造函数:实例化对象首先第一个需要做的事情就是构造函数。一个小孩出生到5岁之前,所有的事情都是父母帮助做的,包括起名字、穿衣服、吃饭等等。        析构函数:一个对象被使用完后需要做一些善后工作,这些善后工作是不需要人为干预的,例如资源释放、变量删除等。例如:一个小狗死后,主人非常爱惜它,就把它埋在了家后园的一颗树下。小狗被埋这件事情是主人做的,不是狗做的。这就是析构函数。        3.类的重写        子类和父类之间的事情,就是说父类有的方法,子类不但可以直接使用,还可以在子类中        重新定义具体内容,例如有一个父亲会驾驶汽车,那么他的儿子也会驾驶汽车,但他的儿子        可以不驾驶汽车,而驾驶飞机,这就是类方法的重写。      D    1.final(最后的)关键字使用        该关键字修饰的类不能被继承        该关键字修饰的方法不能被重写      2.static(静态)关键字使用(类的内部、外部、子类)        实例化对象在内存中的分配有讲到大的数据在内存被分配到堆空间里边。现在有一个例子:有一个        "学生"这个类,里边有一个成员属性是"国家",标识该对象是属于哪个国家的,比如美国、英国、德国等 ,这个类在实例化对象时候,每个对象在内存中都会分配一个空间用于存放国家这个成员属性,如果      有100个对象,那么在内容中会分配100个相应的空间。如果这个类的使用对象是在"中国"境内,那么      每个对象的国家属性就会是一样的,即"中国",相应的在内存中会有100个空间存放100个相同的内容      这会造成空间浪费,其实到这里我们可以知道100个相同的内容用一个空间存放就可以,反正都是一样的,        这就产生了静态化概念"static"。        用static修饰的成员属性,该属性就不是对象的,而是类的。      3.self和parent关键字使用        在类的内部访问类中的成员(属性和方法),可以用"$this",该关键字泛指对象,这是访问一般的类        成员,如果访问的成员是用static关键字修饰的,就不能用"$this"了,因为用static修饰的类        成员是被类本身拥有,不属于任何对象了,这时候需要用"self"关键字修饰 self::成员        在类的外部访问类本身拥有的成员可以这样  类名::成员属性。        在子类中访问父类拥有的成员可以用parent关键字  parent::成员属性      4.const(常量)关键字使用        在php中可以定义常量,类外部用define定义,类内部用const定义。        常量的拥有者是类本身,类内部访问常量用 self::常量                       类外部访问常量用 类名::常量                     子类访问常量    parent::常量      6.魔术方法clone、__call、__autoload使用      clone:在一个项目里边我们有时候需要两个或多个完全一样的初始化对象,这时候可以使用clone技术      不用clone技术也可以,不过每个新的对象都需要初始化属性值,这样比较繁琐,也容易出错, 使用clone就比较简单,克隆出来的多个对象彼此是独立的,互不相干。            $p2 = clone $p1;    __call:在类的使用过程中,如果一个对象调用的方法不在类里边,那么这时候程序要报错,然后程序退           出不能继续运行。这样做用户体验非常不好,如果有一种方法可以使得程序报错完后可以继续运 行,这样的程序给人更智能、用户体验更好的感觉,这时候就可以用__call              public function __call($method_name,$args){               echo "你访问的方法:";               echo $method_name;               echo "参数:";               print_r($args);               echo "不存在";              }        __autoload:开发一个软件系统,往往里边会有很多类,在初始化类对象之前需要先include这个对                 象对应的类文件。所有的类不能都放到一个文件(文件臃肿,不易维护),这样就会在程               序开始处有很多的include列表,这样做非常繁琐,出现一个新的类就需要被include,               有没有一种方法可以使得被include的类文件在实例化对象时候才引入,否则不动作,               答案是有的,这时候可以用魔术方法__autoload                 function __autoload($className){                      include($className.'.php');                 }      8.子类继承父类时候成员修饰符限制,子类的修饰级别大于父类。例如父类的修饰符是protected,        则子类修饰级别是protected或public。父类是public的,子类也必须是public的       1.抽象类        在类里边定义的没有方法体的方法就是抽象方法,有抽象方法的类被称为抽象类。抽象类不能实例化对象。        所谓没有方法体就是方法在声明时候没有花括号和里边的内容。        作用之处:          例如:我有一个类"动物",里边有方法"吃食"(还可以有许多其他的方法)         动物这个类可以有许多子类例如:狗、鱼、鸟等,这些子类有一个共性就是都有吃食这个方法         一般的解决方法是:定义3个类,里边都有吃食方法。这样实现没有问题的,但是如果其中一个         类没有吃食方法,这时候程序是不给报错的。我们现在要做的就是3个类中任何一个没有吃食方法           系统就要报错。这时候就需要用到抽象类了。        抽象类按照字面意思理解就是对3个类的进一步抽象。抽象出来吃食方法。        抽象类技术特性:        a、抽象类不能实例化        b、类的成员方法是抽象的,则这个类也是抽象的        c、抽象方法体内没有实现细节,具体实现留给子类实现        d、继承抽象类的子类必须实现父类的抽象类,除非自己也是抽象类。             2.接口(插座实例)        当一个抽象类里边的全部方法都是抽象方法时候,这个抽象类就是"接口"。        接口技术特性:        a、interface声明        b、全部接口方法是public的,因此可以省略        c、接口只定义方法,没有具体方法实现        d、实现类用implements实现接口,全部接口方法都要实现        e、接口可以多实现,中间用逗号分开        f、接口是对抽象类的抽象,抽象类是对类的抽象,类是对事物的抽象。        g、接口不能实例化        (1)、抽象类和接口有什么不同         抽象类只能单继承,接口可以多实现         抽象类里面可以有抽象方法和普通方法,而接口里只有抽象方法         抽象类里面可以有自己的属性,而接口里面只能有常量         接口里面的方法必须是public的,而抽象类不同        (2)、抽象类和接口的相似之处         抽象类里面的抽象方法在继承的时候必须都要重写,接口里面的方法也必须都要实现。         抽象类和接口都不能直接实例化,        抽象类需要继承(extends),接口需要实现(implements)。         抽象类和接口都体现了多态的特性。   3.jquery        jquery是js的封装包,里边有很多集成的函数可以让我们使用,jquery的宗旨就是写更少的代码实现更多的功能        使用的方法:        1.引进jquery包               <script type="text/javascript" src='jquery-1.4.2.js'><script>        2.测试jquery是否加载成功               $(function(){                      alert("jquey加载成功");               })        3.获取页面的元素               $('#div');通过id获取页面元素                 $('.div');通过class获取页面元素        jquery中的事件        1.$('#mydiv').click(function(){});鼠标点击事件【要写在onload事件里边】        2.$('#mydiv').hover(function(){},function(){});鼠标移动到对象事件        3.$('#mydiv').attr();获得对象属性信息        4.$('#mydiv').attr('checked');查看单复选框的选定情况!        5.$('#mydiv').css();获得对象的属性信息        6.$('#mydiv').css(样式,值);给对象赋予样式        7.$('#mydiv').addClass('trb');给元素class属性赋值trb;        8.$('#mydiv').removeClass('trb');使元素失去class属性;        9.$('#mydiv').submit(function(){});提交事件;        10.$('#mydiv').keyup(function(){});键盘敲击事件;             在项目中的使用:表单的验证   20.  * 什么是单一入口(单点入口)呢?         所谓单一入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,         比如说在上面我们就使用index.php作为程序的单点入口,        当然这个入口文件的名字是可以由自己任意定义的。        单点入口有几大好处:            第一、一些系统全局变量,都可以在这里定义。            比如说你要对数据进行初步的过滤,你要模拟session处理,            你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面            第二、程序的架构更加清晰明了。  
文章
存储  ·  前端开发  ·  PHP  ·  数据库  ·  索引
2016-03-24
PHP&Javascript&CSS&jQuery常用知识大全(整理+原创)
---------------------------------------------------------                      PHP知识大全 --------------------------------------------------------- 1. 变量如何定义?如何检查变量是否定义?如何删除一个变量?怎样检测变量是否设置?        $定义   isset()// 检测变量是否设置         defined()// 检测常量是否设置        unset()//销毁指定的变量        empty()// 检测变量是否为空   2. 什么是可变变量?        一个变量的变量名可以动态的设置和使用。        $a = 'hello' , $$a = 'world',  ${$a}=hello world   3. 变量赋值方式有哪几种?        1)直接赋值   2)变量间赋值   3)引用赋值   4. 引用和拷贝有什么区别?        拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。        引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。   5. php中变量有哪些基本数据类型?        php支持8种原始数据类型包括:        四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string)        两种复合类型(数组array , 对象object)        两种特殊类型(资源resource,NULL)   6. 其它类型转换为boolean类型时,哪些被认为是false?        布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串'0', 空数组,特殊数据类型NULL, 没有设定的变量。      empty()函数在哪些情况下返回true?        布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串'0', array()空数组,特殊数据类型NULL, 没有任何属性的对象,没有赋值的变量。   7. 如果定义了一个变量$a ,但是没有赋初始值              那么$a==0吗?    $a==false吗?    $a==''吗?        $a==NULL吗?    $a===NULL吗?     答:echo=>什么都没有 , var_dump=>NULL        empty($b)==true吗?———————————— echo=>1 , var_dump=>bool(true)        此时如果输出$a++是多少?———————   echo=>什么都没有 , var_dump=>NULL        如果输出++$a又是多少?—————————      echo=>1  , var_dump=>int(1)   8. 字符串怎么转成整数,有几种方法?怎么实现?        强制类型转换: (整型)字符串变量名;        直接转换:settype(字符串变量,整型);        intval(字符串变量);   9. 标量数据和数组的最大区别是什么?        一个标量只能存放一个数据,而数组可以存放多个数据。   10. 常量如何定义? 如何检测一个常量是否被定义?常量的值只能是哪些数据类型?        define()//定义常量 , defined()//检查常量是否定义        常量的值只能是标量类型的数据。   11. 常量分为系统内置常量和自定义常量。请说出最常见的几个系统内置常量?        __FILE__ , __LINE__ , PHP_OS , PHP_VERSION   12. 如果定义了两个相同的常量,前者和后者哪个起作用?        前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。   13. 常量和变量有哪些区别?        1)常量前没有$符号;        2)常量只能通过define()定义,而不能通过赋值语句定义;        3)常量可以在任何地方定义和访问,而变量有全局和局部之分;        4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定义;        5)常量的值只能是标量数据,而变量的数据库类型有8种原始数据类型。   14. PHP中常用的几个预定义的全局数组变量是哪些?        有9大预定义的内置数组变量:        $_POST, $_GET, $_REQUEST, $_SESSION, $_COOKIE, $_FILES,$_SERVER, $_ENV, $GLOBALS   15. 在实际开发中,常量最常用于哪些地方?        1)连接数据库的信息定义成常量,如数据库服务器的用户名、密码、数据库名、主机名;        2)将站点的部分路径定义成常量,如web绝对路径,smarty的安装路径,model、view或者controller的文件夹路径;        3)网站的公共信息,如网站名称,网站关键词等信息。   16. 函数的优越性有哪些?        提高程序的可维护性  提高软件的可靠性  提高程序的可重用性  提高程序的开发效率   17. 如何定义一个函数?函数名区分大小写吗?        1)使用 function 关键字;        2)函数命名规则和变量一样,以字母或者下划线开头,而不能以数字开头;        3)函数名不区分大小写;        4)函数名不可以使用已经声明过的或者系统自建的函数名称。   18. 什么是变量的能见度 或者 说是变量作用域?        就是变量在程序中的可作用范围。根据变量的能见度,变量分为局部变量和全局变量。   19. 什么是局部变量和全局变量?函数内是否可以直接调用全局变量?        局部变量是函数内部定义的变量,其作用域是所在的函数。如果函数外还有一个跟局部变量名字一样的变量,程序会认为它们两个是完全不同的两个变量。当退出函数的时候,其中的局部变量就同时被清除。全局变量是定义在所有函数以外的变量,其作用域是整个php文件,但是在用户自定义的函数内部是无法使用的。如果一定要在用户自定义的函数内部使用全局变量,那么就需要使用global关键字声明。也就是说如果在函数内的变量前加上golbal来修饰,那么函数内部就可以访问到这个全局变量,不仅可以利用这个全局变量进行运算而且可以对这个全局变量进行重新赋值。全局变量还可以使用 $GLOBALS['var'] 来调用。   21. 什么是静态变量?        如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。        一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时,该变量会在函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。   22. php中函数传递参数的方式有哪些?两者有什么区别?        按值传递和按地址传递(或按引用传递)        (1)按值传递:  待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对                该变量值做的修改,不影响原本的变量值。      (2)按地址传递: 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存中是同一个。函数体做的修改,直接影响到函数体外部的该变量的值。     23. 什么是递归函数?如何进行递归调用?        递归函数其实就是调用自身的函数,但是必须满足以下两个条件:        1)在每一次调用自身时,必须是更接近于最终结果;        2)必须有一个确定的递归终止条件,不会造成死循环。        举例说明:        在实际工作中往往会在遍历文件夹的时候使用。        如果有个例子是希望获取到目录windows下所有的文件,那么先遍历windows目录,如果发现其中还有文件夹,那么就会调用自身,继续往下寻找,依次类推,        直到遍历到再也没有文件夹为止,这也就是意味着遍历出来了所有的文件。   24. 判断一个函数是否存在?      function_exists( string $function_name )  如果存在,返回true, 不存在则返回 false。   25. func()和@func()之间有什么区别?        第二个函数调用失败不会报错,第一个会报错   26. include()和require()函数的用法和区别是什么?include_once()和require_once()呢?        include和require出现错误后的错误级别不一样        include_once()和require_once()在加载之前要判断是否已经导入   27. 说出前置++和后置++的区别?        前置++是先将变量增加1,然后在将值赋值给原来的变量;        后置++是先返回变量的当前值,然后再将变量的当前值增加1.   28. 字符串运算符“.”与算术运算符“+”有什么区别?        当“a”“b”之间使用.时认为是连字符。如果两者间是+的时候php会认为是一次运算。        1)如果+号两边的字符串是数字组成的,那么会将字符串自动转为整型;        2)如果+号两边是纯粹的字母,那么会输出0;        3)如果+号两边的字符串是以数字开头的,那么会截取字符串开头的数字,然后进行运算。   29. 什么是三目(或三元)运算符?        根据一个表达式的结果在另两个表达式中选择一个。        例如: ($a==true) ? 'good':'bad';   30. 控制流程语句有哪些?        1:三种程序结构    顺序结构、分支结构、循环结构        2:分支: if/esle/esleif/     switch/case/default        3: switch 需要注意的:               case子句中的常量可以是整型、字符串型常量、 或者常量表达式,不允许是变量。              同一个switch子句中,case的值不能相同,否则只能取到首次出现case中的值。        4: 循环  for while   do...while          do...while 后面必须加入分号结尾。          while 和 do...while 的区别        5:break 和 continue 的区别。               break可以终止循环。               continue没有break强大,只能终止本次循环而进入到下一次循环中。   31. 数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种?        数组是一个可以存储一组或一系列数值的变量(复合型变量)        索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值)        数组的赋值方式有哪两种?        数组的声明方式主要有两种。        1.通过array()函数声明数组; 可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。        2.直接为数组元素赋值,不需要调用array()函数。例如:        $arr[0] = 1;     $arr[1] = 2;        特别注意:        数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。        例如: $array[3] 与  $array['3'] 引用的是相同的一个元素,而 $array['03'] 引用的则就是另外的一个元素了。   32.数组如何遍历?        ①for循环        ②foreach循环  ,这是最常用的遍历方式。用法如下:foreach($arr as $key=>$value){}        ③list each 和while 配合起来循环   33. foeach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢?        当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset().        reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。   34. 如何计算数组长度(或者说计算数组中所有元素的个数)?字符串怎么取长度?        count() -- 计算数组中的元素个数。        可以使用count(数组名)或者count(数组名,1),如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。如果第二个参数是数字0,则等同于只有一个参数的count()函数。        sizeof() -- count() 的别名(count — 计算数组中的单元数目或对象中的属性个数) 字符串:strlen()— 获取字符串长度         mb_strlen()— Get string length   35. 数组中相关的常用函数有哪些?        1) count --(sizeof别名)— 计算数组中的单元数目或对象中的属性个数                  例如:int count ( mixed $var [, int $mode ] )  $var 通常都是数组类型,任何其它类型都只有一个单元。  $mode 默认值为0. 1为开启递归地对数组计数        2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 检查数组中是否存在某个值。如果 needle 是字符串,则比较是区分大小写的。如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。        3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。               特别注意:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。               如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引          4) 数组与字符串之间的转换               (1)explode ( string $separator , string $string [, int $limit ] )  使用一个分隔字符来分隔一个字符串。               (2)implode ( string $glue , array $arr )  使用一个连接符将数组中的每个单元连接为一个字符串。join 为 implode 的别名        5) sort(array &$array [, int $sort_flags ]) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。   36. 数组合并函数array_merge()和数组加法运算$arr + $arr2 的区别是什么?        array_merge()->使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是后者附加到前者后面。"+"->使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃,也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。   37. 字符串定义的时候单引号和双引号有什么区别?        单引号加载速度比双引号加载速度快 38. echo(),print(),print_r()的区别?        (1)echo 是语法,Output one or more strings,没有返回值;        (2)print 是函数,不能输出数组和对象,Output a string,print有返回值;        (3)print_r 是函数,可以输出数组。print_r是个比较有意思的函数,可以输出stirng、int、float、     array、object等,输出array时会用结构表示,print_r输出成功时返回true;而且print_r可以通过print_r($str,true)来,使print_r不输出而返回print_r处理后的值。此外,对于echo和print,基本以使用echo居多,因为其效率比print要高。   39. 按照功能分类说说都有哪些字符串处理函数?这些函数的作用是什么?        A. 字符串输出函数        (1)echo $a,$b,$c......;  是一个语言结构,而不是一个真正的函数。        (2)print($a)    本函数输出字符串。若成功则返回 1,失败返回 0        (3)print_r($a)        (4)var_dump($a); 能输出类型、长度、值        B. 去除字符串首尾空格的函数: trim  ltrim  rtrim(别名:chop)   使用第二个参数,还可以去除指定的字符。        C. 转义字符串函数:addslashes()        D. 获取字符串长度的函数:strlen()        E. 截取字符串长度的的函数:substr()        F. 检索字符串函数: strstr() , strpos()        G. 替换字符串函数:str_replace()   40. 请给出以下问题的正确答案?        1).$arr = array('james', 'tom', 'symfony');请将$arr数组的值用’,’分割并合并成字符串输出?          echo implode(‘,’,$arr);        2).$str = ‘jack,james,tom,symfony’; 请将$str用’,’分割,并把分割后的值放到$arr数组中?           $arr = explode(‘,’,$str);        3).$arr = array(3,7,2,1,’d’,’abc’);   请将$arr按照从大到小的顺序排序,并保持其键值不变?           arsort($arr); print_r($arr);        4).$mail = “gaofei@163.com”;    请将此邮箱的域(163.com)取出来并打印,看最多能写出几种方法?               echo strstr($mail,'163');               echo substr($mail,7);               $arr = explode("@",$mail); echo $arr[1];        5). 如果有一个字符串,该字符串是“123,234,345,”。请问如何切割掉这个字符串最后一个逗号?        6). 获取随机数的函数有哪几个?mt_rand() 和 rand()哪个执行速度快?   41.页面字符出现乱码,怎么解决?        1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是        在header()函数中指定了charset;        例如:        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />        header(“content-type:text/html;charset=utf-8”);        2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致,        两者必须保持统一;        3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一,        例如:mysql_query(“set names utf8”)。   42. 正则表达式是什么?php中有哪些常用的跟正则相关的函数?请写出一个email的正则,中国手机号码和座机号码的正则表达式?        正则表达式是用于描述字符排列模式的一种语法规则。正则表达式也叫做模式表达式。        网站开发中正则表达式最常用于表单提交信息前的客户端验证。        比如验证用户名是否输入正确,密码输入是否符合要求,email、手机号码等信息的输入是否合法        在php中正则表达式主要用于字符串的分割、匹配、查找和替换操作。               preg系列函数可以处理。具体有以下几个:        string preg_quote ( string str [, string delimiter] )        转义正则表达式字符 正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。        preg_replace -- 执行正则表达式的搜索和替换        mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]        preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换        mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )        preg_split -- 用正则表达式分割字符串        array preg_split ( string pattern, string subject [, int limit [, int flags]] )          常用的正则表达式写法:        中文:/^[\u4E00-\u9FA5]+$/        手机号码:/^(86)?0?1\d{10}$/        EMAIL:        /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/        密码(安全级别中):        /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/        密码(安全级别高):        /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/   44. preg_replace()和 str_ireplace()两个函数在使用上有什么不同?preg_split()和split()函数如何使用?   preg_replace — 执行正则表达式的搜索和替换   str_ireplace — str_replace() 的忽略大小写版本   str_replace — 子字符串替换            preg_split — 用正则表达式分割字符串        split — 用正则表达式将字符串分割到数组中   45. 获取当前时间戳的函数主要有哪些?用PHP打印出今天的时间,格式是2010-12-10 22:21:21?        用PHP打印出前一天的时间格式是2010-12-10 22:21:21?如何把2010-12-25 10:30:25变成unix时间戳?        echo date ("Y-m-d H:i:s" ,strtotime(‘-1,days’));            date('Y-m-d H:i:s',time());          $unix_time = strtotime("2009-9-2 10:30:25");//变成unix时间戳        echo date("Y-m-d H:i:s",$unix_time);//格式化为正常时间格式   46.  在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?        用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入<script>alert(111);</script>),php端接收数据的时候,应该如何处理?        使用urlencode()对中文进行编码,使用urldecode()来解码。           使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。   48. 说说mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之间有什么区别?        第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个既可以返回索引数组也可以返回关联数组,取决于它的第二个参数 MYSQL_BOTH MYSQL_NUM  MYSQL_ASSOC 默认为MYSQL_BOTH        $sql =”select * from table1”;        $result = mysql_query($sql);        mysql_fetch_array($result, MYSQL_NUM);   49. 请说出目前学过的返回是资源的函数?        答:       fopen(打开文件)                 imagecreatefromjpeg(png gif) — 从 JPEG 文件新建一图像                 imagecreatetruecolor — 新建一个真彩色图像                 imagecopymerge — 拷贝并合并图像的一部分                 imagecopyresized  — 拷贝部分图像并调整大小                 mysql_connect  — 打开一个到 MySQL 服务器的连接               mysql_query();只有这执行select的时候成功,才返回资源,失败返回FALSE               50. 打开、关闭文件分别是什么函数? 文件读写是什么函数?删除文件是哪个函数?        判断一个文件是否存在是哪个函数?新建目录是哪个函数?   51. 文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?        1.首现要在php.ini中开启文件上传;        2.在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改;        3.上传表单一定要记住在form标签中写上enctype="multipart/form-data";        4. 提交方式 method 必须是 post;        5. 设定 type="file" 的表单控件;        6.要注意上传文件的大小MAX_FILE_SIZE、文件类型是否符合要求,上传后存放的路径是否存在。 可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名,这样就避免了重名。可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成将文件保存到指定目录。     52. $_FILES是几维数组?第一维和第二维的索引下标分别是什么?批量上传文件的时候需要注意什么?        二维数组。第一维是上传控件的name,二维下标分别为name/type/tmp_name/size/error.   53. header()函数主要的功能有哪些?使用过程中注意什么?        答:     header()发送http头信息    -header("content-type:text/html; charset=utf-8");-------------------//当前页面输出内容是html,编码为utf-8格式    -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    -header("content-type:image/png gif jpeg");----------------------------------//当前页面输出内容的格式是图片    -header("refresh:5;url=http://www.1004javag.com/five/string.php");--//页面5秒后要跳转到新网址 -header("location:http://1004javag.com/five/string.php");-----------//页面重定向 54. 文件下载的时候如果使用header()函数?        答:header("content-type: application/octet-stream;charset=UTF-8"); //在这里加utf-8和在上面定义有什么区别?、??              header("accept-ranges: bytes");             header("accept-length: ".filesize($filedir.$filename));             header("content-disposition: attachment; filename=".$filedir.$filename);     55. 什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么?        ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。     '$'是jQuery的别名.     页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回给这个ajax引擎,   最后由这个ajax引擎来决定将返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。        这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,        减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。               Ajax的优点是:        1.  减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;        2.  在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。        Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。        ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。   56. jquery是什么?jquery简化ajax后的方法有哪些?        jQuery是Javascript的一种框架。        $.get(),$.post(),$.ajax()。$是jQuery对象的别名。          代码如下:        $.post(异步访问的url地址 , {'参数名' : 参数值} , function(msg){               $("#result").html(msg);        });               $.get(异步访问的url地址 , {'参数名' : 参数值} , function(msg){               $("#result").html(msg);        });          $.ajax({               type: "post",               url: loadUrl,               cache:false,               data: "参数名=" + 参数值,               success: function(msg) {                      $("#result").html(msg);               }        });     57. 什么是会话控制?        简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。目前最主要的会话跟踪方式有cookie,session。   58. 会话跟踪的基本步骤        1).访问与当前请求相关的会话对象  2).查找与会话相关的信息        3).存储会话信息     4).废弃会话数据   59. 使用cookie的注意事项有哪些?        1) setcookie()之前不可以有任何页面输出,就是空格,空白行也不可以;        2) setcookie()后,在当前页面调用$_COOKIE['cookiename']不会有输出,必须刷新或到下一个页面才可以看到cookie值;        3) 不同的浏览器对cookie处理不同,客户端可以禁用cookie,浏览器也可以闲置cookie的数量,一个浏览器能创建的cookie数量最多300个,并且每个不可以超过4kb,        每个web站点能设置的cookie总数不能超过20个。        4) cookie是保存在客户端的,用户禁用了cookie,那么setcookie就不会起作用了。所以不可以过度依赖cookie。   60. 使用session的时候,通过什么来表示当前用户,从而与其他用户进行区分?        sessionid,通过session_id()函数可以取得当前的session_id。   61. session和cookie的使用步骤分别是什么?什么是sesssion和cookie的生命周期?session和cookie的区别是什么?        cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,当再次打开浏览器时cookie值依然有效。             session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是哪个用户的。              两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。        session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。           使用session的步骤:        1. 启动session:使用session_start()函数来启动。        2. 注册会话:直接给$_SESSION数组添加元素即可。        3. 使用会话:判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。        4. 删除会话:               1.可以使用unset删除单个session;               2.使用$_SESSION=array()的方式,一次注销所有的会话变量;               3.使用session_destroy()函数来彻底销毁session。        cookie怎么使用?        1. 记录用户访问的部分信息        2. 在页面间传递变量        3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。        创建cookie:setcookie(string cookiename , string value , int expire);        读取cookie:通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。        删除cookie:有两种方法        1.手工删除方法:        右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除。        2.setcookie()方法:        跟设置cookie的方法一样,不过此时将cookie的值设置为空,有效时间为0或小于当前时间戳。   62. 如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效?        一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少?        setcookie(‘username’,’jack’,time()+7*24*3600);        最多可以产生20个cookie,每个最多不超过4K   63. 设置或读取session之前,需要做什么?        可以直接在php.ini中开启session.auto_start = 1或者在页面头部用session_start();        开启session,session_start()前面不能有任何输出,包括空行。   64. 在实际开发中,session在哪些场合使用?        session用来存储用户登录信息和用在跨页面传值。        1)常用在用户登录成功后,将用户登录信息赋值给session;        2)用在验证码图片生成,当随机码生成后赋值给session。   65. 注销session会话的形式有几种?        unset()   $_SESSION=array();   session_destroy();   66. 什么是OOP?什么是类和对象?什么是类属性?        OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象。        世间万物都具有自身的属性和方法,通过这些属性和方法可以区分出不同的物质。        属性和方法的集合就形成了类,类是面向对象编程的核心和基础,        通过类就将零散的用于实现某个功能的代码有效地管理起来了。              类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,类在实例化之后就是对象。类是对象的抽象概念,对象是类的实例化。    对象是一个高级的数组,数组是一个最原始的对象,同样的对象也可以遍历        OOP具有三大特点:         1. 封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。        2. 继承性:就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。 php只支持单继承,也就是说一个子类只能有一个父类。        3. 多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。          OOP的优点:1、代码重用性高(省代码)    2、使程序的可维护性高(扩展性)  3、灵活性           67. 常用的属性的访问修饰符有哪些?分别代表什么含义?        private,protected,public。           类外:public ,var        子类中:public,protected ,var        本类中:private,protected,public ,var        如果不使用这三个关键词,也可以使用var关键字。但是var不可以跟权限修饰词一起使用。var定义的变量,子类中可以访问到,类外也可以访问到,相当于public        类前面:只能加final,abstract        属性前面:必须有访问修饰符(private,protected,public,var)        方法前面:static,final,private,protected,public ,abstract   68. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用?        $this 当前对象   self  当前类   parent  当前类的父类        $this在当前类中使用,使用->调用属性和方法。        self也在当前类中使用,不过需要使用::调用。    parent在类中使用。   69.类中如何定义常量、如何类中调用常量、如何在类外调用常量。        类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。        定义常量使用关键字const.        例如:const PI = 3.1415326;        无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,        访问常量的格式都是类名加作用域操作符号(双冒号)来调用。        即:类名 :: 类常量名;   70. 作用域操作符::如何使用?都在哪些场合下使用?        调用类常量   调用静态方法   71. 什么是魔术方法?常用的魔术方法有哪几个?        以__开头的系统自定义的方法。        __construct()  __destruct()   __autoload()   __call()    __tostring()   72. 什么是构造方法和析构方法?        构造方法就是在实例化一个对象的同时自动执行的成员方法,作用就是初始化对象。        php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()就是构造方法。如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数,没有任何操作。        构造方法的格式如下:        function __construct(){}        或者:function 类名(){}        构造方法可以没有参数,也可以有多个参数。        析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。        析构方法的定义方法为:__destruct();        因为php具有垃圾回收机制,能自动清除不再使用的对象,释放内存,一般情况下可以不手动创建析构方法。   73. __autoload()方法的工作原理是什么?        使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。        当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时. 就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。   74. 什么是抽象类和接口?抽象类和接口有什么不同和相似的地方?        抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。        抽象类是通过关键字 abstract 来声明的。        抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,        抽象方法没有方法体,该方法天生就是要被子类重写的。        抽象方法的格式为:abstract function abstractMethod();                   因为php中只支持单继承,如果想实现多重继承,就要使用接口。也就是说子类可以实现多个接口。接口类是通过interface关键字来声明的,接口类中的成员变量和方法都是public的,方法可以不写关键字public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。子类继承抽象类使用extends,子类实现接口使用implements。        抽象类至少有一个抽象方法吗??????        答:如果一个类声明成抽象类,里面可以没有抽象方法            如果一个类中有抽象方法,这个类必须是抽象类   75. __call的参数有几个,类型是什么,意义是什么?        魔术方法__call()的作用是当程序调用一个不存在或不可见的成员方法时,php会先调用__call()方法,将那个不存在的方法的方法名和参数都存储下来。        __call()包含两个参数,  第一个参数是那个不存在的方法的方法名,是个字符串类型;                             第二个参数是那个不存在的方法的所有参数,是个数组类型。        本人认为__call()方法的意义更多在于调试,可以定位到错误。同时可以捕捉异常,如果某个方法不存在,则执行其它可替代方法。   76. smarty模板技术的用途是什么?        为了php与html分开,美工和程序员各司其职,互不干扰。   77. smarty配置主要有哪几项?        1. 引入smarty.class.php;        2. 实例化smarty对象;        3. 重新修改默认的模板路径;        4. 重新修改默认的编译后文件的路径;        5. 重新修改默认的配置文件的路径;        6. 重新修改默认的cache的路径。        7. 可以设置是否开启cache。        8. 可以设置左侧和右侧定界符。   78. smarty在使用过程中需要注意哪些细节?        Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,也就是说smarty技术将用户UI与php代码分离开。这样程序员和美工各司其职,互不干扰。        smarty运用过程中要注意以下几个问题:        1.正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;        2.php页面中使用assign赋值 和 display显示页面;        3.smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。               A.{}               B. foreach               C. if else               D. include               E. literal   79. MVC的概念是什么?各层主要做什么工作?        MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。        M指Model模型层,V是View视图层(显示层或者用户界面),C是Controller控制器层。        使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。        在网站开发中,        模型层一般负责对数据库表信息进行增删改查,        视图层负责显示页面内容,        控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,        执行完毕后由控制器层决定将结果assign到哪个view层。   81. java语言中方法重写和重载分别代表什么意思?准确说php支持方法的重载吗?很多参考书中提到的php重载实际上该如何正确理解?        答:        php不支持方法的重载,很多书里提到的PHP‘重载’应该是‘重写’   82. final关键字能定义类中的成员属性吗?        答:不能,类的成员属性只能有public ,private , protected ,var 来定义   83. final关键字定义的类能够被继承吗?        答:final定义的类不能被继承   84. 说说static关键字的使用场合?static能用在class前吗?     static可以跟public,protected,private一起使用吗?构造方法可以是static的吗?        答:       static可以在属性和方法前面使用,调用static属性或者方法时,只要将类载入就可用,不用实例化               static不能用在class的前面                   static可以跟public,protected,private一起使用,在方法的前面;               ▲构造方法不能是static   85. 接口可以实例化吗?抽象类能实例化吗?        答:接口和抽象类都不能被实例化   86. class前面能加访问修饰符吗?如果能加,只能是哪几个访问修饰符?可以是权限访问修饰符public,protected,private吗?        答:class前面可以加final,static;        class前面不能加public,protected,private   87. 类中属性前可以不加访问修饰符吗?成员变量前的修饰符只能是public,protected,private吗?还可以是哪几个?        答:类中的属性必须加修饰符,除了那3个以外,还可以加var   88. 如果echo一个数组,页面输出什么?echo一个对象呢?print一个数组或者对象呢?        答:页面只能输出“Array”;echo一个对象会出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php on line 33”            print一个数组时也只是输出“Array”,print一个对象出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php ”            ▲print和echo是一样的             89. __tostring()魔术方法在什么时候被自动执行? __tostring()魔术方法必须要return返回值吗?        当echo或者print一个对象时,就是自动触发。而且__tostring()必须要返回一个值        90. 什么是抽象方法?        答:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有   91. 如果一个类中有一个方法是抽象方法,而这个类没有定义成抽象类,会报错吗?           答:会,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"   92. 如果一个类是抽象类,而类中的方法都是非抽象的方法,会报错吗?        答:不会报错,如果一个类是抽象类,其中可以没有抽象方法,但是一个类中有个方法是抽象方法,那么这个类一定是一个抽象类   94. final 关键字的应用应注意的问题?          使用final关键字定义的类,禁止继承。        使用final关键字定义的方法,禁止重写。   95. 如果一个类既要继承一个父类,又要实现多个接口,该如何写?        书写格式例如: class MaleHuman extends Human implements Animal,Life { ... }   96. 什么是单点入口呢?         所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,         比如说在上面我们就使用index.php作为程序的单点入口,当然这个是可以由你自己任意控制的。        单点入口有几大好处:            第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面            第二、程序的架构更加清晰明了。   97. PHP提供了2套正则表达式函数库,分别是哪两套?【        (1) PCRE   Perl兼容正则表达式         preg_   为前缀        (2) POSIX  便携式的操作系统接口       ereg_   为前缀   98. 正则表达式的组成?     由原子(普通字符,如英文字符)、     元字符(有特殊功用的字符)     模式修正字符     一个正则表达式中,至少包含一个原子   99. 不常用魔术方法的触发时机?        __isset()  __unset()的触发时机        __sleep()、 __wakeup()  在对对象进行串行化的时候调用        如果序列化对象的时候,不写__sleep()方法,则所有的成员属性都会被序列化,而定义了__sleep()方法,则只序列化指定数组中的变量。因此,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。        使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。        使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。               101.常见框架        thinkPHP  yii  ZendFramework  CakePhp  sy   102. 常用魔术方法的触发时机?        1)__autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行__autoload()。程序希望通过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。__autoload()方法的工作原理是什么?当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。        2)__construct()  :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果有参数,那么new这个对象的时候要记得写上相应的参数。在php5以前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。如果一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起作用,普通构造方法不起作用。反之,在php5以前版本中,不认识魔术构造方法,只是把该方法当做普通的方法。        3)__destruct()  :这个是魔术析构方法。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。析构方法没有参数。        4)__call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行__call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。        5)__get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行__get()。它有一个参数,表示要调用的属性的名称。        6)__set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行__set()。它包含两个参数,分别表示属性名称和属性值。        7)__tostring()  :当程序使用echo或print输出对象时,会自动调用该方法。目的是希望通过该方法将对象转化为字符串,再输出。__tostring() 无参数,但是该方法必须有返回值。        8)__clone()  :当程序clone一个对象的时候,能触发__clone()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。   103. MVC的概念是什么?        MVC(即模型-视图-控制器)是80年代发明的一种软件设计模式或者说编程思想。        M指模型层,V是指视图层(显示层或者用户界面),C是指控制层。        使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。        C存在的目的则是在M和V之间起到调节作用,确保M和V的同步,一旦M改变,V应该能同步更新。        将M和V分离,就可以做到同一个网页,在不同节日到来的时候能显示不同的页面风格,这只需要提前制作多个视图层模板页面,        而无需更改M层程序。        MVC做到了编程中的分工合作,代码的可重用性得到最大化体现,程序逻辑更加清晰而富有条理,便于后期维护管理。   104、     访问权限修饰符有哪几种,对比解释        答:1、public 表示公共的,在本类中和子类中以及类外,可以对其调用        2、protected表示受保护的,可以在本类中和子类中调用        3、private表示私有的,只能在本类中调用        4、var,效果等同于public 105、     Class关键词前可以有哪些修饰词        a)    Final修饰,表示该类是最终的,无法继承        b)    Abstract修饰,表示该类是抽象类   106、     作用域操作符在那些场合下使用        答:作用于操作符的使用场合        a)    本类中:               i.     self::类常量               ii.     self::静态属性               iii.    self::方法()   parent::方法()        b)    子类中:               i.     parent::类常量               ii.     parent::静态属性(public或者protected)               iii.    parent::方法()(public或者protected)        c)    类外:               i.     类名::类常量               ii.     类名::静态属性(public)               iii.    类名::静态方法(public)   107、     $this,self, parent分别代表什么?哪些场合下使用        答:$this代表的是当前对象  self代表的是当前的类  parent代表的是当前类的父类        使用场合:        $this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法;        self只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;        parent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法。   108、     说明是接口、抽象类二者有何相同和不同的地方?        1、接口是帮助php实现功能意义上的多继承的,用interface来声明,其方法没有方法体,使用implemens关键词来实现接口。        接口中只能包含抽象方法和类常量,不可以包含成员属性。        2、抽象类是一种不能被实例化的类,只能作父类,用abstract class来定义,抽象类和普通类可以没有区别,类中可以包含成员属性、类常量、方法。        子类得用extends来继承,而且只能是单继承。        两者相同点是都不可以被实例化,都是需要被继承才可以使用。        两者的最大区别是接口可以实现多继承,而抽象类只能是单继承。        接口中不能包含成员属性,而抽象类中可以有成员属性。        接口中的抽象方法必须是public或者无访问修饰词,接口中的抽象方法不能用abstract来修饰。        抽象类中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract来修饰。   109、     解释PHP中单例模式?        又叫做单态模式、单元素模式、singleton pattern。单例模式指在PHP的应用程序的范围内只对指定的类创建一个实例。使用单例模式的类称为单例类。在php中单例类必须要有一个私有的构造方法,还要有一个私有的魔术克隆方法(该方法体中为空)和一个私有的静态的成员属性$_instance.私有构造方法防止除自身以外的类来实例化它。私有的方法体为空的克隆方法防止该类被克隆。$_instance用来存储被自身实例化后的对象。还必须要有一个公共的静态的方法getInstance()。该方法返回已经存储了实例对象的$_instance。   单例:一个类至始至终只能实例化一个对象,这样的类就是单例类 单例类的优点:① 节省空间 ② 节省资源 实现单例类的四个要点:①私有的构造函数②私有的__clone的方法③私有的静态属性,属性有以保存类的实例④公共的静态方法来实例化对象 无限级分类:         ①数据库设计:region_id(自增ID) region_name(地区名称) parent-id(上级地区id) region_path(全路径)        ②程序设计:全路径的作用:a根据全路径顺序取数据 b用作信息层级显示    110、   什么是SQL注入?        SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,        没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,        程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,        成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。   111、   如何防止SQL注入?        要对提交的信息进行过滤,对单引号进行转义。        首先可以在php.ini中设置,让所有的单引号在提交后都进行转义。或者使用addslashes().   112、     FCKEditor自动过滤的解决办法?        如果您需要编辑模板页,默认的FCK设置是会去掉<HTML></HTML><BODY></BODY>标签,而且会给你加上<P></P>标签的,如果需要保留的话,只要更改下设置可以了。        在fckconfig.js里面有:FCKConfig.FullPage = false ;        改为:FCKConfig.FullPage = true;        如果想去掉自动添加<P>的代码就可以在这里设置        默认是        FCKConfig.EnterMode = 'p' ;    // p | div | br        FCKConfig.ShiftEnterMode = 'br' ; // p | div | br        改成        FCKConfig.EnterMode = 'br' ;    // p | div | br        FCKConfig.ShiftEnterMode = 'p' ; // p | div | br   113、     $_REQUEST、$_GET、$_POST、$_COOKIE 的关系和区别:            1.关系:$_REQUEST包含了$_GET、$_POST、$_COOKIE等的所有内容,是它们的集合体。        2.通过$_REQUEST获取变量值,PHP页面因为不确定它是哪种传值方式,        因此会根据php.ini中的配置来接收值。        php.ini里可以设置,variables_order = “GPC”。其含义是GET,POST,COOKIE.        所以PHP页面会先从$_GET中获取,再从$_POST中获取,然后从$_COOKIE中获取。        新获得的值会覆盖之前获取到的值。        因此从表现形式上看,$_REQUEST最后是获取$_COOKIE中的值,如果$_COOKIE中没有值,        会获取$_POST中的值,如果$_POST没有获取到 ,就去$_GET中获取。        如果$_GET中也没有该值,那么$_REQUEST就返回null。               114、     什么是多条件查询(复合查询),如何实现多条件查询?        如何实现万能查询呢?查询的时候要填写查询条件,这些条件会通过表单进行提交。        首先需要检查提交的条件是否为空。如果不为空,就认为这个值是要被当作条件,        我们就可以使用字符串连接的方式来组合一个sql查询语句。        当执行后获取查询结果。   115.       文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?        1). 首现要在php.ini中开启文件上传;        2). 在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改;        3). 上传表单一定要记住在form标签中写上enctype="multipart/form-data";        4). 提交方式 method 必须是 post;        5). 设定 type="file" 的表单控件,并且必须具有name属性值;        6). 为了上传成功,必须保证上传文件的大小是否超标、文件类型是否符合要求,上传后存放的路径是否存在;        7). 表单提交到接收页面,接收页面使用$_FILES来接收上传的文件。$_FILES是个多维数组。第一维下标是上传控件的name,二维下标分别为name/type/tmp_name/size/error。分别代表文件名、文件类型、上传到临时目录下的临时文件名、文件大小、是否有错误。如果是批量上传,那么二维下标就是数组,而并非是字符串。        8). 文件上传后是被放置在服务器端临时路径下,需要使用move_uploaded_file ()函数,才可以将上传后的文件保存到指定目录。        9). 为了避免上传文件重名,可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名。   116.      使用GD2库创建图像的步骤?        1). 创建一个画布:imagecreate();        2). 设置画布背景颜色,使用RGB设置颜色:imagecolorallocate();        3). 设置文字颜色:imagecolorallocate();        4). 在画布上书写文字:imagestring();        5).  以 JPEG 格式将图像输出到浏览器或文件:【根据图片格式不同,函数还可以是imagepng()、imagegif()等】   imagejpeg();        6). 清除图像资源:imagedestroy();   117.      GD2库生成缩略图的步骤是什么?        1). 读取希望生成缩略图的源图像,创建图像对象:【根据图片格式不同,函数也相应不同】               $src_image = imagecreatefromjpeg();        2). 获取原图像的宽度和高度$srcW,$srcH,根据缩放比例计算出新图像的宽度和高度$dstW、$dstH:        3). 创建一个真色彩的图像对象,宽度和高度设置成刚才计算出的宽度和高度:               $dst_image = imagecreatetruecolor($dstW,$dstH);        4). 拷贝图像并调整大小:   imagecopyresized();        5). 将图像输出:【根据图片格式不同,函数也相应不同】  imagejpeg();        6). 清除图像资源(将源图像资源和目标图像资源都清除)   imagedestroy();   118.      GD2库给图片增加水印如何做?        1. 添加简单的文本水印:               利用imagestring()函数就可以在图片上写文本水印。        2. 增加一个图形水印:               1). 读取希望增加水印的源图片,创建图像对象:【根据图片格式不同,函数也相应不同】                      $image = imagecreatefromjpeg();               2). 创建一个水印图片的图像对象:                      $watermark = imagecreatefrompng();               3). 拷贝并合并图像:                      imagecopymerge();               4). 将图像输出:【根据图片格式不同,函数也相应不同】                      imagejpeg();               5). 清除图像资源(将源图像资源和水印图像资源都清除)                      imagedestroy();   119.      什么是事务?什么是回滚?事务的作用是什么?        事务就是组合起来的几个独立的sql操作。如果其中一项失败,那么就让这几个组合起来的sql操作都回退到未执行状态。这就是事务的回滚。mysql中MyISAM存储引擎的表不支持事务,只有InnoDB 存储引擎的表才支持事务,为了让事务正常执行,就需要让参与事务的所有数据表都设置成innoDB类型。事务被包装在了 BEGIN 和 COMMIT 语句之间。在没有使用 COMMIT 语句的情况下,对数据库的操作不是永久的,一旦运行了 ROLLBACK,就会被回退。只有执行了COMMIT,数据表中的信息才被改动。事务的目的就是为了保证数据的完整性。   120.      模拟SESSION机制实现数据库存放会话数据有什么作用?【备用】       如果使用默认的SESSION机制,大家都知道默认的SESSION_ID是存放在COOKIE中,用户的身份是靠SESSION_ID来识别的,而COOKIE文件是存放在用户浏览器的客户端,这样就会带来一个问题,当用户在办公室选择一些商品到购物车,在准备下订单付款的时候,用户选择了支付宝在线的支付方式,恰巧办公室的电脑上面没有安装支付宝的数字证书,而在用户家里的电脑安装过数字证书,所以呢,用户就需要回家去支付。但是回家登录商城之后,发现购物车中精心挑选的商品都不存在了。这是为什么呢?问题就在家里电脑上的并没有存放SESSION_ID的cookie文件,因而就无法正确的读取服务器上对应session文件中的数据,所以无法将原来的选择的商品息读取过来。这样的购物车功能给用户的用户体验式非常糟糕的,所以我们就需要采取模拟SESSION机制使用数据库来存放会话数据。   121.       什么是无限极分类?        要实现无限极分类,数据库建表是关键。        表结构中至少需要三个字段,如果想避免递归循环,那么需要四个字段。        1. id ,当前数据的唯一标识;        2. typename ,类型名称;        3. parentid , 当前类型的上一层父类型的id;        4. path , 其中存储当前类型的id和它所有父级类型的id。        这些id之间采用“-”隔开。        5. 当通过以下sql语句就可以实现,相同顶级类下的信息都在一起集中显示。        select * from 表名 where 条件 order by path; 无限极分类的原理是什么?        要实现无限极分类,数据库表结构是关键。        表结构中至少需要三个字段,如果想避免递归循环,那么需要四个字段。        1. id ,当前数据的唯一标识;        2. typename ,类型名称;        3. parentid , 当前类型的上一层父类型的id;        4. path , 其中存储当前类型的id和它所有父级类型的id。        这些id之间采用“-”隔开。        5. 当通过以下sql语句就可以实现,相同顶级类下的信息都在一起集中显示。         select * from 表名 where 条件 order by path;   122.    分页原理是什么?        数据分页需要以下几个条件:        1. 参与分页的总条数 【$msg_count】 ,该值通过数据库查询可以获取到;        2. 每页显示的条数【$pagesize】 ,这个数值由自己定义;        3. 当前页的页码数 【$page】,该数值通过地址栏传递和接收;        4. 可以通过以上资料计算出总页数 【$pagecount】 ,此处需要借助ceil();               【$pagecount = ceil($msg_count/$pagesize);】        5. 数据库查询借助sql语句中的【limit】来实现数据的变化:               例如:               select * from 表名 where 条件 limit $startnum , $pagesize;               而$startnum = ($page-1)*$pagesize;   123、   如何在smarty模板语言中使用php代码?        借助于两个smarty内建函数。        1. inluce_php 函数用于在模板中包含 php 脚本。例如:        {include_php file="test.php"}        2. php 标签允许在模板中直接嵌入 php 脚本。例如:        {php}               echo "这个是php内建函数的作用";        {/php}        124、   请列出至少五个smarty中的变量调节符并说明功能?        default  例如:{$arr|default:’xxxx’} ,默认变量调节器,当变量为空时显示给定的默认值        truncate   例如:{$articleTitle|truncate:10} , 切割字符串长度为指定的长度;        count_characters   例如:{$articleTitle|count_characters} ,获取字符串长度;        strip_tags   例如:  {$articleTitle|strip_tags} ,去除字符串中的所有html标签;        date_format  例如:{$smarty.now|date_format(‘’)} ,格式化时间戳。   125、   写程序实现如下功能:       a.如何判断一个字符串中是否存在一个字符?        echo strstr('abcdefgcd'  , 'cd');        echo strpos('ab0defgcd'  , 'cd');       b.如何判断一个字符串中一个字符出现的次数?        echo substr_count('abcdefgcd'  , 'cd');       c.如何去掉一个字符串的最后一个字符        echo substr('abcdefgcd'  , 0 ,  -1);   126、     如何使用smarty的缓存、步骤?什么叫单模板多缓存?        如果给整个网站开启缓存,那么$smarty->caching=1,此时缓存的时间为smarty.class.php中默认的时间,也就是3600秒。如果对每一个页面独立设置缓存,那么$smarty->caching=2 ,缓存时间就会跟display的参数模板页相挂钩,也就是可以实现对每个模板页设置不同的缓存时间。        用法例如:        if(!$smarty->is_cached('index.html')) {               //此处可以执行数据库操作               $smarty->cache_lifetime = 3600*6;        }        $smarty->display('index.html');               对于例如新闻单条这样的页面,新闻的模板都是一个,如果开启缓存,那么所有的新闻单页的缓存都是一个,根本不会随着id的变化而变换内容。所以为了区分不同的页面缓存,需要使用单模板多缓存技术。具体做法是以id作为display的第二个参数来实现。此外对于具有分页的列表页,也必须在display中使用第二个参数,可以使用新闻类型id和当前页面合并成第二个参数。   127、   写一个递归函数完成以下功能:向函数中传一个多维数组,对数组中所有的值做判断        ,如果值是’number’则设置该值为0?(提示:该题考的是递归的应用,因为传入的数组不确定是多少维的,所以需要递归判断)          function recursive_array($arr) {               if(is_array($arr)) {                      foreach($arr as $key=>$value) {                             if(is_array($value)) {                                    $arr[$key] = recursive_array($value);                             } else {                                    if($value=='number') {                                           $arr[$key] = '0';                                }                             }}}               return $arr;        }          128、   使用jquery写一个全选的例子?        //全选与取消全选        function selectAll(flag) {               for(var i=0; i<$("#fonds input").size(); i++) {                      $("#fonds input").get(i).checked=flag;               }}        //判断复选框已经被勾选了多少个?        function checkFonds() {               var count=0;               for(var i=0; i<$("#fonds input").size(); i++) {                      if($("#fonds input").get(i).checked==true) {                             count++;                      }}               alert(count);        }        //利用后代选择器和get()来获取指定的控件        $(“div a”).get(2)   129、     请说明smarty中fetch方法的功能?        Fetch方法可以获取到页面所有的内容,并且赋值到一个变量中。        如果第四个参数为true,则等同于display,直接输出到浏览器中。        如果第四个参数为false,则不输出。        Display方法就是第四个参数为true的fetch方法。        Display = Fetch() + echo()   130、   写出关于文件上传的相关函数?                    strrchr($filename , '.');      explode('.' , $filename);        end($arr);                     strrpos($filename , '.');        substr($filename , $pos+1);    pathinfo($filename , PATHINFO_EXTENSION);        date(‘YmdHis’)               time()      rand();        mt_rand()                      move_uploaded_file()   131、   如何将SESSION存放在数据库中,可以结合数据表设计说明.        默认情况下php.ini中session.save_handler = files,也就是session是以文件形 式存储的。        如果想更改为数据库或其它存储方式,那么需要更改设置,让 session.save_handler = user。        除了在php.ini中配置外,还可以在PHP页面中单独配置,用        ini_set ('session.save_handler, 'user')来设置session的存储方式,设置为用户自定义存储方式。        设置好存储方式后,需要使用session_set_save_handler()函数。        该函数是设置用户级别的session保存过程的函数。该函数有6个参数,这6个参数其实是6个自定义函数的名称,分别代表对session的开启,关闭,读,写 ,销毁,gc(垃圾回收)。        示例代码如下:        function open () { }        function close() { }        function read () { }        function write () {}        function destroy () {}        function gc () {}        session_set_save_handler ("open", "close", "read", "write", "destroy",  "gc");        session_start();        现在你就可以象往常一样地使用session了。        数据库结构如下:        Session_id , session_value ,expire_time , 分别存储sessionid的id和值以及失效时间。   132、    常用的正则表达式写法:        中文:/^[\u4E00-\u9FA5]+$/        手机号码:/^(86)?0?1\d{10}$/        EMAIL:        /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/        密码(安全级别中):        /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/        密码(安全级别高):        /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/ ——————————————————————————                     PHP初     —————————————————————————— order顺序 var(variables)变量 model典型 样式 模型 module模数;模块;组件 enctype SEO搜索引擎优化(Search Engine Optimization) Search搜索 Engine 引擎 Optimization最佳化,最优化 mod_rewrite模块重写 CMS 内容管理系统(content manage system) electronic commerce(电子商务) gc(garbage collection)垃圾回收   ---------------Apache与WAMP安装--------------- 1.wamp安装 apache (2.2版本) mysql(5.067版本)  php(5.2版本)   LAMP  Linux下的安装 负责版本控制 SVN 一台机器能安装多个apache服务 但是只能安装一个MySQL服务 -------------PHP上------------- PHP: personal home page  个人家庭主页  94年产生的 5.2.6版本 ASP: active  server page   93 JSP: java server page   类里面定义常量叫类常量 用const定义 类常量必须有初始值 define('','','false/true')里有三个参数,默认为false时区分大小写,反之不区分大小写 在类里面叫做方法  在类外叫做函数 常量默认为大小写敏感。 ::作用域操作符   标量和非标量类型的区别:标量只能存一个数据,非标量能存多个数据 (属性  变量名  类常量)区分大小写 (变量  类名  系统自带函数  自定义函数)不区分大小写  当$_POST['user_name']等没加‘’是会先当作常量来编译 3.函数 可变函数:函数的名字是一个变量 可选参数:参数有默认值 递归(recursive)函数体内有一个循环体,自己调用自己,但他跟死循环有区别,死循环是没有尽头的,     他是无限循环,递归有尽头,他最终会获得一个值 function pager( $page $msg_count $pagesize $url="?"){ }----》$url="?"即为可选参数     数组的合并 array_merge()              $arr1+$arr2 两数组相加: 只要是具有相同的下标,则只保留首次出现的元素,后者舍去 array_merge:索引数组会将后者的元素附加到前者后面;若是关联数组,相同下标,后者覆盖前者    explode() 取数组最后一个元素 8.文件的操作    mkdir新建目录    rmdir删除目录    skandir输出指定路径下的文件或目录    fopen(资源)— 打开文件或者 URL    fclose— 关闭一个已打开的文件    fgets — 一次读取一行    fgetc — 一次只读取一个字符    fgetss — 一次读取一行并过滤掉 HTML 标记    file_get_contents — 将整个文件读入一个字符串    fread-读取文件    file_put_contents— 将一个字符串写入文件    fwrite-写入文件    unlink-删除文件    pathinfo — 返回文件路径的信息 array_push — 将一个或多个单元压入数组的末尾(入栈) array_unshift — 在数组开头插入一个或多个单元 9.其它函数    输出控制函数:ob(output buffer) ob_flush    加密函数 md5    数学类函数:abs绝对值,rand随机数,ceil取整,floor,mt_rand生成更好的随机数    转换函数:explode 使用一个字符串分割另一个字符串,implode    时间函数:date(),strtotime (将字符串转换为时间戳)    处理地址栏: url_encode url_decode 10.乱码问题    ASCII(American Standard Code for Information Interchange)81年产生    ANSI 美国国家标准学会( American National Standards Institute)    utf-8(-8代表一次传输8个字符)可变字节编码(中文3个字节)(utf:Unicode转换格式(UCS Transformation Format)      utf-16(-16代表一次传输16个字符)    GBK. 国家标准扩展码(Guo-Biao Kuozhan)90年产生(双字节编码)    GB2312 因为国际排行2312位(81年产生)    BIG5    unicode (国际编码)可变字节编码    Latin_1    utf-8+ bom    ISO:国际标准化组织(International Standardization Organization)   11.数据库操作    数据库优化:char(查询速度快)               varchar        引擎:myisam(mysql indexed sequential access method)索引顺序访问方法        支持事务的引擎:BDB ,innodb        innodb:是以inno开头的一家公司的商标   表类型就是表的存储引擎     dll:动态数据连接库  封装的类库   修饰符:public,var,protected,private,static,final,abstract 访问权限修饰符:public,private,protected        public:类成员访问没有限制,多有外部成员都可以访问        protected:受保护的,不能被类外部成员访问,该类的直接子类可以访问,可以实现对成员属性的读、写操作        private:私有的,只能类里边的成员自己访问,类外部的成员都不能访问        一个属性被修饰为私有的(private),那么这个属性在类的外部是不可以读取和修改的,现在有一种方法 可以设置该属性既是私有的,还可以被类的外部成员读取即__get()和__set()    修饰class的修饰符:final,abstract(抽象) final被它修饰的类是不能被继承的 定义属性必须要加修饰符:可以是public和var 定义方法时可以有修饰符public,可以不写,默认为public   如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。 final只能出现在class类和方法中   方法前可以有public,private,protected,static,final,abstract修饰。     继承性:耦合性越低越好  const修饰,一定要有初始值 ( smarty的保留变量:{$smarty.now},{$smarty.const},{$smarty.post},{$smarty.get},{$smarty.cookies},{$smarty.config},{$smarty.session},){$smarty.capture}  调用属性时,如果前有$后边就不能有,后有前不能有,如:$this->abc                                               self::$abc 当用parent调用父类方法时,将方法自动转化为静态的   多态性:由继承  重写(覆盖)(重新写一遍)(override重写)造成的             php不支持重载(重复载入),php为弱变量语言(overload重载)   抽象:一个类包含抽象方法就是抽象类,抽象类中不一定有抽象方法 抽象类的定义abstract 接口里可以有抽象类,还可以有类常量,通过interface来定义一个接口, 实现多个接口时,接口中的方法不能有重名。 接口中定义的所有方法都必须是public,这是接口的特性。 接口里的方法必须被重写 静态:static 不能与构造方法共存,static不能new对象,构造方法可以new对象,方法体中不能用$this   在php5以前的版本中,当普通构造方法和__construct(魔术方法)共存在时,它会调用普通构造方法,它对__construct(魔术方法)是不识别的,在php5以后的版本中,当共存时他会先调用__construct(魔术方法)。析构方法是最后被执行的,被自动调用的方法 单例(单态)singleton ——————————————————————————                     PHP中     —————————————————————————— 2.jQuery   包括javascript框架和prototype.js框架 选择器:   1.基本选择器:     ①、$('#result')=jQuery('#result')=document.getElementById('result')                            <div id='result'>                         <div class='result'>    ②、class选择器 $('.result')    ③、元素选择器$('div')   2.子代选择器:$('#myform < input')   3.后代选择器:$('#myform  input')   4.组合选择器:$('#myform < span < input') 3.Ajax  ajax的用处是用来异步js和xml 不仅可以获取xml数据,还可获得hmtl和json数据    ajax的优点:1.提升用户的体验2.占用带宽小3.减小服务器的负载    ajax就是把B页面的内容,显示到A页面的指定位置,实现异步传输    $.ajax() 返回其创建的 XMLHttpRequest 对象。    $.ajax({     url:,  data:,  type:,  datatype:,  success:function(这个参数里,存在被传回的页面的所有内容){}   });   $.post('请求地址','传递参数','回调函数');   $.get('请求地址','传递参数','回调函数'); post传值文件没有大小限制,保密性好,必须有form表单 get传值安全性不高,有大小限制 当地址栏里有中文时,用urlencode(编码 URL 字符串) urlencode — 编码 URL 字符串 urldecode(解码已编码的 URL 字符串)   4.会话控制         session:unset()和array() 是连同内存和session文件内容一起删除,而session_destroy只是将文件删除    cookie没有生命周期的叫会话cookie,随着浏览器的关闭,cookie消失    cookie有两种存在方式,一种是以文件形式存在,另一种是保存在内存里    cookie里面只能存字符串   会话控制主要是为了跨页面传值 序列化是把其他的类型转换成字符串类型 5.smarty 代码重用(include,require,include_once,require_once) include require 比 require_once include_once 性能高  加载类文件用 require_once(最好) include_once   6.PDO    dsn(data source name)    //数据源    $dsn = 'mysql:host=127.0.0.1;dbname=java1008a'; die('到此结束'); 等同于 echo '到此结束';die;   ----------------------------------------------------------------------------------   2.b/s与c/s简单比较,区别: --a、运行环境不同(广域网、局域网) --b、安全级别不同(低/高) --c、用户群不同(全部用户/局部用户) --d、系统升级不同(无缝升级/整体升级) --e、用户开启不同(浏览器/特制软件) --f、软件界面特点不同(信息流/用户体验)   比如:b/s就是网上的微博、博客;c/s就是在网吧打的网络游戏(奇迹、传奇等) 3.php是什么:运行在服务器端的脚本语言 --Hypertext Preprocessor --personal home page 4.php语言能做什么 --图形化用户界面程序 --服务器端运行脚本程序   3.php外部变量$_POST[]、$_GET[];     特殊运算符   '.'是连接符   ".="是连接赋值   "@"屏蔽错误信息  $link=@mySQl_connect(主机,用户名,密码) 5.流程控制(顺序、选择、循环) ****************************************************************************** ****************************************************************************** 第三单元【字符串】 1.字符串的三种定义方式(单引号、双引号、定界符) ---单引号定义(转义\'和\\) ---双引号定义(转义\n \r \t \$ \\ \") ---定界符方法<<<eof   2.函数部分 explode/implode substr()** str_replace/trim/ltrim/rtrim   strstr(str, search)获得指定字符串最开始出现到最后的内容 strrchr(str, search)获得指定字符串最后出现到最后的内容 strpos(str,  search)获得指定字符串最开始出现的位置 strrpos(str, search)获得指定字符串最后出现的位置 ucfirst(str)将字符串第一个字母大写 ucwords(str)将字符串的每个单词的第一个字母大写 strlen(str)获得字符串长度 strcmp(str1, str2)比较两个字符串大小,                 返回负数表示 str1 小于 str2;                 返回正数表示 str1 大于 str2;                 返回零表示二字符串相同   urlencode(str)替换所有非字母数字的字符,变为%后面跟两位16进制数,空格变为+号 urldecode(str)对已%##编码的URL进行解析还原 parse_url(str)解析完整的url转变为为数组 parse_str(str,out)解析请求字符串转变为数组 htmlspecialchars()转换html代码为实体代码 printf/sprintf %b %d %c %x %s %f %X –    b           整数转成二进位。 –    c            整数转成对应的 ASCII 字符。 –    d           整数转成十进位。 –    f            单倍精确度数字转成浮点数。 –    o           整数转成八进位。 –    s            转成字符串。 –    x            整数转成小写十六进位。 –    X           整数转成大写十六进位。   1.数组和栈的操作   array_push(目标数组,字符串)将字符串压入数组的最后   array_pop(目标数组)将数组最后的元素弹出并返回 2.数组和队列的操作   array_unshift(目标数组,字符串)将字符串放到数组的开始位置   array_shift(目标数组)删除数组的第一个元素并返回 3.数组和指针的操作key() current() next() prev() reset() end() 4.预定义数组($_GET $_POST $_FILES $_COOKIE $_SESSION) ****************************************************************************** ****************************************************************************** 第六单元【其他常用函数】 date(format,[timestamp])//格式化时间信息,并返回 time()//返回当前时间戳信息   mktime(hour,minute,second,month,day,year) mktime(小时,分钟,秒,月,天,年)//取得一个日期的 Unix 时间戳   max()//取得最大值 -echo max(1, 3, 5, 6, 7);  // 7 -echo max(array(2, 4, 5)); // 5 -echo max(0, '1hello');     // 1hello -echo max('hello', 0);     // hello -echo max(-1, 'hello');    // hello -echo max(array(2, 4, 8), array(2, 5, 7)); // array(2, 5, 7) -echo max('string', array(2, 5, 7), 42);   // array(2, 5, 7)数组和非数组比较数组总认为最大   mt_rand(65,94)//获得随机数 round()//四舍五入取整 flush()//输出准备区内容 urlencode('张三')//返回字符串中,除了-_.之外的所有非字母数字部分为%后接两位 16进制数,空格转化为+ urldecode()//对已经编码的部分反编码 var_dump()//输出变量的详细信息(八种数据类型数据都可以输出)   chr(mt_rand(65,94))随机获得字母 ord(chr(mt_rand(65,94)))将字母转化为数字 basename(路径名)获得路径中文件名部分 strtolower转换小写   第七单元【php连接mysql】 *mysql_connect(主机,用户名,密码) 打开一个到 MySQL 服务器的连接 *mysql_select_db(数据库,连接数据库资源) 选择 MySQL 数据库 *mysql_query("set names utf8");设定字符集          *mysql_close() 关闭 MySQL 链接 *mysql_query(语句) 发送并执行一条sql语句 mysql_fetch_row(结果资源)从结果集中取得一行结果(索引数组) mysql_fetch_assoc(结果资源)从结果集中取得一行结果(关联数组) *mysql_fetch_array(结果资源)从结果集中取得一行结果(索引/关联数组) mysql_fetch_object(结果资源)从结果集中取得一行结果(对象数组)   mysql_errno()返回错误号码 *mysql_error()返回错误信息 *mysql_num_rows(结果资源)用于计算查询结果中所得行的数目 *mysql_affected_rows()获得受影响的结果数目 *mysql_insert_id()传回最后一次使用 INSERT 指令产生的自动增长 ID 值   mysql_result(结果集,索引行,字段)指定获取结果 mysql_free_result(结果资源)释放结果集 mysql_num_fields(结果资源)用于计算查询结果中所得列的数目 mysql_fetch_field(结果资源)从结果集中取得列的结果,以对象形式返回 mysql_pconnect()永久连接数据库   1.留言板建立数据库bbs,建立两张表leave_word和back_word(留言表和回复表)   leave_word:   字段       数据类型   id        int         主键、自增   title     varchar(20) 标题   content   text        内容   itime     datetime    添加时间     back_word:   id        int         主键、自增   leave_id  int         外键(留言id)   content   text        内容   btime     datetime    回复时间 4.删除留言,对无效、无用的留言实现删除功能(这时需要用get方式传递被删除留言id值) 5.修改留言,对需要修改(get方式传递被删除留言id值,再利用隐藏域方式传递给接收页面) 6.留言详细显示功能,有的留言内容比较多,在明细页面不可能全部显示出来(这时利用get方式传递留言id) 7.在详细页面可以实现回复功能和回复留言展示,步骤:制作一个回复表单和接收数据页面        3.构造方法和析构方法        构造函数:实例化对象首先第一个需要做的事情就是构造函数。一个小孩出生到5岁之前,所有的事情都是父母帮助做的,包括起名字、穿衣服、吃饭等等。        析构函数:一个对象被使用完后需要做一些善后工作,这些善后工作是不需要人为干预的,例如资源释放、变量删除等。例如:一个小狗死后,主人非常爱惜它,就把它埋在了家后园的一颗树下。小狗被埋这件事情是主人做的,不是狗做的。这就是析构函数。        3.类的重写        子类和父类之间的事情,就是说父类有的方法,子类不但可以直接使用,还可以在子类中        重新定义具体内容,例如有一个父亲会驾驶汽车,那么他的儿子也会驾驶汽车,但他的儿子        可以不驾驶汽车,而驾驶飞机,这就是类方法的重写。      D    1.final(最后的)关键字使用        该关键字修饰的类不能被继承        该关键字修饰的方法不能被重写      2.static(静态)关键字使用(类的内部、外部、子类)        实例化对象在内存中的分配有讲到大的数据在内存被分配到堆空间里边。现在有一个例子:有一个        "学生"这个类,里边有一个成员属性是"国家",标识该对象是属于哪个国家的,比如美国、英国、德国等 ,这个类在实例化对象时候,每个对象在内存中都会分配一个空间用于存放国家这个成员属性,如果      有100个对象,那么在内容中会分配100个相应的空间。如果这个类的使用对象是在"中国"境内,那么      每个对象的国家属性就会是一样的,即"中国",相应的在内存中会有100个空间存放100个相同的内容      这会造成空间浪费,其实到这里我们可以知道100个相同的内容用一个空间存放就可以,反正都是一样的,        这就产生了静态化概念"static"。        用static修饰的成员属性,该属性就不是对象的,而是类的。      3.self和parent关键字使用        在类的内部访问类中的成员(属性和方法),可以用"$this",该关键字泛指对象,这是访问一般的类        成员,如果访问的成员是用static关键字修饰的,就不能用"$this"了,因为用static修饰的类        成员是被类本身拥有,不属于任何对象了,这时候需要用"self"关键字修饰 self::成员        在类的外部访问类本身拥有的成员可以这样  类名::成员属性。        在子类中访问父类拥有的成员可以用parent关键字  parent::成员属性      4.const(常量)关键字使用        在php中可以定义常量,类外部用define定义,类内部用const定义。        常量的拥有者是类本身,类内部访问常量用 self::常量                       类外部访问常量用 类名::常量                     子类访问常量    parent::常量      6.魔术方法clone、__call、__autoload使用      clone:在一个项目里边我们有时候需要两个或多个完全一样的初始化对象,这时候可以使用clone技术      不用clone技术也可以,不过每个新的对象都需要初始化属性值,这样比较繁琐,也容易出错, 使用clone就比较简单,克隆出来的多个对象彼此是独立的,互不相干。            $p2 = clone $p1;    __call:在类的使用过程中,如果一个对象调用的方法不在类里边,那么这时候程序要报错,然后程序退           出不能继续运行。这样做用户体验非常不好,如果有一种方法可以使得程序报错完后可以继续运 行,这样的程序给人更智能、用户体验更好的感觉,这时候就可以用__call              public function __call($method_name,$args){               echo "你访问的方法:";               echo $method_name;               echo "参数:";               print_r($args);               echo "不存在";              }        __autoload:开发一个软件系统,往往里边会有很多类,在初始化类对象之前需要先include这个对                 象对应的类文件。所有的类不能都放到一个文件(文件臃肿,不易维护),这样就会在程               序开始处有很多的include列表,这样做非常繁琐,出现一个新的类就需要被include,               有没有一种方法可以使得被include的类文件在实例化对象时候才引入,否则不动作,               答案是有的,这时候可以用魔术方法__autoload                 function __autoload($className){                      include($className.'.php');                 }      8.子类继承父类时候成员修饰符限制,子类的修饰级别大于父类。例如父类的修饰符是protected,        则子类修饰级别是protected或public。父类是public的,子类也必须是public的       1.抽象类        在类里边定义的没有方法体的方法就是抽象方法,有抽象方法的类被称为抽象类。抽象类不能实例化对象。        所谓没有方法体就是方法在声明时候没有花括号和里边的内容。        作用之处:          例如:我有一个类"动物",里边有方法"吃食"(还可以有许多其他的方法)         动物这个类可以有许多子类例如:狗、鱼、鸟等,这些子类有一个共性就是都有吃食这个方法         一般的解决方法是:定义3个类,里边都有吃食方法。这样实现没有问题的,但是如果其中一个         类没有吃食方法,这时候程序是不给报错的。我们现在要做的就是3个类中任何一个没有吃食方法           系统就要报错。这时候就需要用到抽象类了。        抽象类按照字面意思理解就是对3个类的进一步抽象。抽象出来吃食方法。        抽象类技术特性:        a、抽象类不能实例化        b、类的成员方法是抽象的,则这个类也是抽象的        c、抽象方法体内没有实现细节,具体实现留给子类实现        d、继承抽象类的子类必须实现父类的抽象类,除非自己也是抽象类。             2.接口(插座实例)        当一个抽象类里边的全部方法都是抽象方法时候,这个抽象类就是"接口"。        接口技术特性:        a、interface声明        b、全部接口方法是public的,因此可以省略        c、接口只定义方法,没有具体方法实现        d、实现类用implements实现接口,全部接口方法都要实现        e、接口可以多实现,中间用逗号分开        f、接口是对抽象类的抽象,抽象类是对类的抽象,类是对事物的抽象。        g、接口不能实例化        (1)、抽象类和接口有什么不同         抽象类只能单继承,接口可以多实现         抽象类里面可以有抽象方法和普通方法,而接口里只有抽象方法         抽象类里面可以有自己的属性,而接口里面只能有常量         接口里面的方法必须是public的,而抽象类不同        (2)、抽象类和接口的相似之处         抽象类里面的抽象方法在继承的时候必须都要重写,接口里面的方法也必须都要实现。         抽象类和接口都不能直接实例化,        抽象类需要继承(extends),接口需要实现(implements)。         抽象类和接口都体现了多态的特性。   3.jquery        jquery是js的封装包,里边有很多集成的函数可以让我们使用,jquery的宗旨就是写更少的代码实现更多的功能        使用的方法:        1.引进jquery包               <script type="text/javascript" src='jquery-1.4.2.js'><script>        2.测试jquery是否加载成功               $(function(){                      alert("jquey加载成功");               })        3.获取页面的元素               $('#div');通过id获取页面元素                 $('.div');通过class获取页面元素        jquery中的事件        1.$('#mydiv').click(function(){});鼠标点击事件【要写在onload事件里边】        2.$('#mydiv').hover(function(){},function(){});鼠标移动到对象事件        3.$('#mydiv').attr();获得对象属性信息        4.$('#mydiv').attr('checked');查看单复选框的选定情况!        5.$('#mydiv').css();获得对象的属性信息        6.$('#mydiv').css(样式,值);给对象赋予样式        7.$('#mydiv').addClass('trb');给元素class属性赋值trb;        8.$('#mydiv').removeClass('trb');使元素失去class属性;        9.$('#mydiv').submit(function(){});提交事件;        10.$('#mydiv').keyup(function(){});键盘敲击事件;             在项目中的使用:表单的验证   20.  * 什么是单一入口(单点入口)呢?         所谓单一入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,         比如说在上面我们就使用index.php作为程序的单点入口,        当然这个入口文件的名字是可以由自己任意定义的。        单点入口有几大好处:            第一、一些系统全局变量,都可以在这里定义。            比如说你要对数据进行初步的过滤,你要模拟session处理,            你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面            第二、程序的架构更加清晰明了。  
文章
JavaScript  ·  前端开发  ·  PHP  ·  数据库  ·  索引
2013-01-07
开发与运维
5756 人关注 | 133164 讨论 | 317864 内容
+ 订阅
  • 可观测系统如何识别网站有多少文件命中了缓存?
  • Python 异步: 非阻塞流(20)
  • 【数据恢复】感染.mallox勒索病毒的数据能否恢复?
查看更多 >
数据库
252933 人关注 | 51905 讨论 | 98685 内容
+ 订阅
  • Java8的Stream API使用
  • 教你如何快速在Linux中找到某个目录中最大的文件
  • oracle 常用命令
查看更多 >
大数据
188697 人关注 | 30681 讨论 | 83582 内容
+ 订阅
  • 可观测系统如何识别网站有多少文件命中了缓存?
  • 基于matlab实现AdaBoost数据分类
  • 【风力】基于Matlab模拟风力涡轮机的雷达信号
查看更多 >
云原生
234317 人关注 | 11561 讨论 | 47171 内容
+ 订阅
  • 云计算常用模块
  • 【DSW Gallery】EasyCV-基于关键点的视频分类示例
  • 【DSW Gallery】基于EasyCV的视频分类示例
查看更多 >