PHP的意思
PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页
什么是面向对象?主要特征是什么?
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。
isset() 和 empty() 区别
Isset判断变量是否存在,如果存在则返回真,empty判断变量是否为空为假,如果为空为假则返回真。
include与require的区别?
1.include()在执行文件时每次都要进行读取和评估
require()文件只处理一次(实际上文件内容替换了require()语句)
2.require()通常放在PHP脚本程序的最前面
include()的使用和require()一样,一般放在流程控制的处理区段中,PHP脚本文件读到include()语句时,才将它包含的文件读进来,这种方式,可以把程序执行时的流程简单化
3,require()和include()语句是语言结构,不是真正的函数,可以像PHP的其他语言结构一样
4,include_once()和require_once()语句也是在脚本执行期间包括并运行指定文件,与include()require()唯一的区别是如果文件中的代码已经被包括了,则不会再次包括.
5,require()包含文件失败,停止执行,给出错误(致命的)
include()常用于动态包含.
通常是自动加载的文件,即使加载出错,整个程序还是继续执行
一个页面声明,另一个页面调用
包函文件失败,继续向下执行,返回一条警告
PHP字符串中单引号与双引号的区别?
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
function test(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//输出1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b;//输出101
in, not in, exist, not exist的作用和区别?
in在什么中
Not in 不在什么中
Exists 存在
Not exists 不存在
面向对象中接口和抽象类的区别及应用场景?
1、有抽象方法的类叫做抽象类,抽象类中不一定有抽象方法,抽象方法必须使用abstract关键字定义。
2、接口中全部是抽象方法,方法不用使用abstract定义。
3、当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口。
echo(),print(),print_r()的区别?
echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
Print()只能打印出简单类型变量的值(如int,string)
print_r()可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
foo()和@foo()之间有什么区别?
@foo()控制错误输出
线性表和顺序表的区别?
1、线性表包括顺序表和链表。
2、顺序表中的元素的地址是连续的,链表里面节点的地址不是连续的,是通过指针连起来的。
能够使html和php分离开使用的模板?
Smarty、template、PHPlibTemplate、FastTemplate
使用那些工具进行版本控制?
Clear case、CVS、SVN、PVCS、Perforce、CCC、StarTeam、RCS
什么是模板技术、能够使HTML和PHP分离开使用的模板?
模板技术就是使程序的逻辑代码和界面分开的技术。
能够使HTML和PHP分开的模板有:Smarty、Template、PHPlib Template、FastTemplate
实现中文字串截取无乱码的方法
Mb_substr();
用PHP写出显示客户端IP与服务器IP的代码
获取客户端IP:get_env(“REMOTE_ADDR”);
获取服务器端IP:$_SERVER[“SERVER_ADDR”];
写几个魔术方法并说明作用?
__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法
__unset()当对一个未定义变量调用unset()时自动调用的方法
__isset()当对一个未定义变量调用isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法
$ _REQUEST、 $ _POST、$ _GET、$ _COOKIE、$ _SESSION、$_FILE的意思是什么?
它们都是PHP预定义变量
$_REQUEST用来获取post或get方式提交的值
$_POST用来获取post方式提交的值
$_GET用来获取get方式提交的值
$_COOKIE用来获取cookie存储的值
$_SESSION用来获取session存储的值
$_FILE用来获取上传文件表单的值
数组中下标最好是什么类型的,为什么?
数组的下标最好是数字类型的,数字类型的处理速度快。
++i和i++哪一个效率高,为什么?
++i效率比i++的效率更高,因为++i少了一个返回i的过程。
magic_quotes_gpc()、magic_quotes_runtime()的意思是什么?
Magic_quotes_gpc()是php配置文件中的,如果设置为on则会自动POST,GET,COOKIE中的字符串进行转义,在‘之前加
Magic_quotes_runtime()是php中的函数,如果参数为true则会数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义。
框架中什么是单一入口和多入口,单一入口的优缺点?
1、多入口就是通过访问不同的文件来完成用户请求。
单一入口只web程序所有的请求都指向一个脚本文件的。
2、单一入口更容易控制权限,方便对http请求可以进行安全性检查。
缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。
你对Memcach的理解,优点有哪些?
Memcache是一种缓存技术,在一定的时间内将动态网页经过解析之后保存到文件,下次访问时动态网页就直接调用这个文件,而不必在重新访问数据库。使用memcache做缓存的好处是:提高网站的访问速度,减轻高并发时服务器的压力。
Memcache的优点:稳定、配置简单、多机分布式存储、速度快。
用PHP写出一个安全的用户登录系统需要注意哪些方面。
1、密码要使用MD5(密码+字符串)进行加密。
2、登录表单的名称不要跟数据库字段一样,以免暴漏表字段。
3、用户表的表名、字段名、密码尽量用不容易被猜到的。
4、要使用验证码验证登陆,以防止暴力破解。
5、验证提交的数据是不是来自本网站。
6、登录后台处理代码数据库部分使用预处理,做好过滤,防止sql注入。
字符串转数组,数组转字符串,字符串截取,字符串替换,字符串查找的函数分别是什么?
数组转字符串Implode()、字符串转数组explode()、substr()、str_replace()、strpos、strrpos、strstr
谈谈对mvc的认识?
由模型(model),视图(view),控制器(controller)完成的应用程序
由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
视图是用户看到并与之交互的界面。
模型表示企业数据和业务规则。
控制器接受用户的输入并调用模型和视图去完成用户的需求。
MVC的优点:低耦合性、高重用性和可适用性、较低的生命周期成本、快速的部署、可维护性、可扩展性,有利于软件工程化管理
MVC的缺点:没有明确的定义,完全理解MVC并不容易。不适合小型规模的应用程序。
PHP如何抛出和接收错误?
使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会抛出一个异常。Catch代码块捕获异常,并创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。
PHP的网站主要攻击方式有哪些?
1、命令注入(Command Injection)
2、eval注入(Eval Injection)
3、客户端脚本攻击(Script Insertion)
4、跨网站脚本攻击(Cross Site Scripting, XSS)
5、SQL注入攻击(SQL injection)
6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
7、Session 会话劫持(Session Hijacking)
8、Session 固定攻击(Session Fixation)
9、HTTP响应拆分攻击(HTTP Response Splitting)
10、文件上传漏洞(File Upload Attack)
11、目录穿越漏洞(Directory Traversal)
12、远程文件包含攻击(Remote Inclusion)
13、动态函数注入攻击(Dynamic Variable Evaluation)
14、URL攻击(URL attack)
15、表单提交欺骗攻击(Spoofed Form Submissions)
16、HTTP请求欺骗攻击(Spoofed HTTP Requests)
几个重要的php.ini选项
Register Globals
php>=4.2.0,php.ini的register_globals选项的默认值预设为Off,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患。
safe_mode
安全模式,PHP用来限制文档的存取、限制环境变量的存取,控制外部程序的执行。启用安全模式必须设置php.ini中的safe_mode = On
1、限制文件存取
safe_mode_include_dir = “/path1:/path2:/path3″
不同的文件夹用冒号隔开
2、限制环境变量的存取
safe_mode_allowed_env_vars = string
指定PHP程序可以改变的环境变量的前缀,如:safe_mode_allowed_env_vars = PHP_ ,当这个选项的值为空时,那么php可以改变任何环境变量
safe_mode_protected_env_vars = string
用来指定php程序不可改变的环境变量的前缀
3、限制外部程序的执行
safe_mode_exec_dir = string
此选项指定的文件夹路径影响system、exec、popen、passthru,不影响shell_exec和“”。
disable_functions = string
不同的函数名称用逗号隔开,此选项不受安全模式影响
magic quotes
用来让php程序的输入信息自动转义,所有的单引号(“’”),双引号(“””),反斜杠(“\”)和空字符(NULL),都自动被加上反斜杠进行转义
magic_quotes_gpc = On 用来设置magic quotes 为On,它会影响HTTP请求的数据(GET、POST、Cookies)
程序员也可以使用addslashes来转义提交的HTTP请求数据,或者用stripslashes来删除转义
使用过哪些PHP框架。试描述其优劣点。
1、BroPHP框架:
优点:轻量级学习型框架,配置简单,操作简单,容易上手,提供了比较全面的文档。
缺点:
2、ThinkPHP框架:
优点:功能比较全面,配置相对比较简单,操作相对比较简单,有很多使用示例程序。
缺点:提供的操作方法太多,新手不知如何选择,文档不够全面。
php中,模板引擎的目的是什么? 你用过哪些模板引擎?
使用模板引擎的目的是使程序的逻辑代码和html界面代码分离开,是程序的结构更清晰。
使用过的模板引擎:Smarty、ThinkPHP的ThinkTemplate
如何在页面之间传递变量(至少两种方式) ?
GET,POST,COOKIE,SESSION
你所知道的php数组相关的函数?
array()----创建数组
array_combine()----通过合并两个数组来创建一个新数组
range()----创建并返回一个包含指定范围的元素的数组
compact()----建立一个数组
array_chunk()----将一个数组分割成多个
array_merge()----把两个或多个数组合并成一个数组
array_slice()----在数组中根据条件取出一段值
array_diff()----返回两个数组的差集数组
array_intersect()----计算数组的交集
array_search()----在数组中搜索给定的值
array_splice()----移除数组的一部分且替代它
array_key_exists()----判断某个数组中是否存在指定的key
shuffle()----把数组中的元素按随机顺序重新排列
array_flip()----交换数组中的键和值
array_reverse()----将原数组中的元素顺序翻转,创建新的数组并返回
array_unique()----移除数组中重复的值
你所知道的PHP的一些技术(smarty等)?
Smarty,jquery,ajax,memcache,div+css,js,mysqli,pdo,svn,thinkphp,brophp,yii
你所熟悉的PHP论坛系统 有哪些?
Discuz
你所熟悉的PHP商城系统 有哪些?
Ecshop
你所熟悉的PHP开发框架 有哪些?
Brophp,thinkphp
你所知道的设计模式有哪些?
工厂模式、策略模式、单元素模式、观察者模式、命令链模式
说说你对代码管理的了解? 常使用那些代码版本控制软件?
通常一个项目是由一个团队去开发,每个人将自己写好的代码提交到版本服务器,由项目负责人按照版本进行管理,方便版本的控制,提高开发效率,保证需要时可以回到旧版本。
常用的版本控制器:SVN
说说你对SVN的了解?优缺点?
SVN是一种版本控制器,程序员开发的代码递交到版本服务器进行集中管理。
SVN的优点:代码进行集中管理,版本控制容易,操作比较简单,权限控制方便。
缺点:不能随意修改服务器项目文件夹。
怎么找到PHP.ini的路径?
一般都在php的安装目录下,或者window系统的windows目录下。
PHP加速模式/扩展? PHP调试模式/工具?
Zend Optimizer加速扩展
调试工具:xdebug
请列出5个常用的PHP操作MySQL的函数
1、Mysql_connect()
2、Mysql_select_db()
3、Mysql_query()
4、Mysql_fetch_row()
5、Mysql_close()
什么是时间戳? 如何取得当前时间戳?
时间戳是从1970年1月1日 00:00:00到指定日期的秒数。
获取当前时间戳:time()
有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?
获取网页内容:
$url=”http://www.phpres.com/index.html“;
$str=file_get_contents($url);
简述如何得到当前执行脚本路径,包括所得到参数
$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];取得当前页面的完整路径和参数。
取得参数:$_SERVER['QUERY_STRING'];
如何用php的环境变量得到一个网页地址的内容?ip地址又要怎样得到?
echo $_SERVER ["PHP_SELF"];
echo $_SERVER ["SERVER_ADDR"];
求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
$begin=strtotime(“2007-2-5″);
$end=strtotime(“2007-3-6″);
echo ($end-$begin)/(24*3600);
给一个变量赋值为0123,但是输出该变量的值总是为其他数字,请问这是什么问题?
PHP 解释器会把以0开始的数字当做是八进制的,所以它的值会变成八进制的。
PHP里面如何定义一个常量(constant)?
通过define()指令,例如:define(”MYCONSTANT”, 100)
如何对一个变量进行值传递?
可以像C++那样, 在变量的前面加上&, 例如:KaTeX parse error: Expected 'EOF', got '&' at position 5: a = &̲b
在PHP里面可以对string “10″ 和整型 11进行比较吗?
可以,PHP内部实现会把所有东西转换成整型,所以数字10和11可以进行比较
在什么情况下需要用endif 来结束条件语句?
当if语句后面跟的是冒号”:”而不是大括号{时,需要用endif来结束条件语句
实现中文字串截取无乱码的方法。
function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
$str=null;
$len=$start+$length;
for($i=$start;$i<$len;$i++){
if(ord(substr($string,$i,1))>0xa0){
$str.=substr($string,$i,2);
$i++;
}else{
$str.=substr($string,$i,1);
}
}
return $str.’…’;
}else{
return $string;
}
}
分别指出php.ini中 magic_quotes_gpc, magic_quotes_runtime两项参数的作用.
Magic_quotes_gpc的作用是在POST、GET、COOKIE数据上使用addslashes()自动转义。
Magic_quotes_runtime参数的作用是设置状态,当状态为0时则关闭自动转义,设置为1则自动转义,将数据库中取出来的单引号、双引号、反斜线这些字符加上反斜杠转义。
用面向对象来实现A对象继承B和C对象
Interface B{ ... }
Interface C{ ... }
Class A implements B,C{ ... }
写出Smarty模板引擎中你最常用的关键词
Assign Display Foreach
Section Loop Item
$smarty Now Const get
如何快速下载一个远程http服务器上的图片文件到本地?
$ file=”";
$ fp=fopen( $ file,’rb’);
$ img=fread( $ fp,10000);
$ dir=”./”;
$ local=fopen($ dir.’/’.basename($ file),’w');
Fwrite($ local,$ img);
Fatal error: Call to undefined method ge_user() in /website/index.php on line 39
调用了未定义的方法ge_user(),检查程序中有没有定义此方法
Fatal error: Class ’client’ not found in /website/index.php on line 173
类client没有找到,检查文件中有没有client类,或者有没有包含client类文件
Warning: Cannot modify header information - headers already sent by (output started at /website/index.php:1) in /website/index.php on line 3
提示文件前面有输出,检查是否有输出,或者编码
Warning:session_start(): open(/website/tmp/sess_47e067121facf033785f9a1cb16d243b, O_RDWR) failed: No such file or directory (2) in /website/index.php on line 10
没有找到文件或目录,检查文件是否存在
Parse error: syntax error, unexpected T_STRING in /website/index.php on line 18
18行语法错误,检查语法
Warning:fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /website/index.php on line 2
没有找到welcome.txt文件,检查文件是否存在
抓取远程图片到本地,你会用什么函数?
fsockopen, A
用PHP打印出前一天的时间,打印格式是2007年5月10日22:21:21
Echo date(‘Y-m-d H:i:s’,strtotime(‘-1 day’));
//正在浏览当前页面用户的 IP 地址:127.0.0.1
echo $_SERVER["REMOTE_ADDR"].”<br />”;
//查询(query)的字符串(URL 中第一个问号 ? 之后的内容):id=1&bi=2
echo $_SERVER["QUERY_STRING"].”<br />”;
//当前运行脚本所在的文档根目录:d:inetpubwwwroot
echo $_SERVER["DOCUMENT_ROOT"].”<br />”;
在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?
heredoc的语法是用”<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串
例子:
$str = << my name is Jiang Qihui!
SHOW;
如何声明一个名为”myclass”的没有方法和属性的类?
class myclass{ }
如何实例化一个名为”myclass”的对象?
new myclass()
你如何访问和设置一个类的属性?
$object = new myclass();
$newstr = $object->test;
$object->test = "info";
指出一些在PHP输入一段HTML代码的办法。
echo "aaa";
下面哪个函数可以打开一个文件,以对文件进行读和写操作?[ c ]
(a) fget() (b) file_open() (c) fopen() (d) open_file()
写出匹配URL的正则表达式.
/^[a-zA-z]+:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?/
请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
if(isset($_POST['action']) && $_POST['action']==’submitted’){
$email=$_POST['email'];
if(!preg_match(“/^(?:w+.?)*w+@(?:w+.?)*w+$/”,$email)){
echo “电子邮件检测失败”;
}else{
echo “电子邮件检测成功”;
}
}
请写一个函数验证电子邮件的格式是否正确
function checkemail($email){
echo preg_match(‘/^[\w]+@[\w]+[\.]([\w]+)$/’,$email)?’email格式正确‘:’email格式不正确‘;
}
请写出一个正则表达式,用于匹配一个HTML文件中标记中的图片地址
$url=”<img src=’11.jpg’/>”;
/<img[\s]*src=['|\"](.*)['|\"][\s]*\/>/
写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把scrīpt标记及其内容都去掉):
preg_replace("//si", "newinfo", $script);
在PHP中error_reporting这个函数有什么作用?
设置 PHP 的报错级别并返回当前级别。
php读取文件内容的几种方法和函数?
打开文件,然后读取。Fopen() fread()
打开读取一次完成 file_get_contents()
以下程序,变量str什么值的情况下输入111?
if( ! $str ) { echo 111; }
在$str值为:0,’0′,false,null,”"
请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。
常见的排序算法: 冒泡排序法、快速排序法、简单选择排序法、堆排序法、直接插入排序法、希尔排序法、合并排序法。
冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就象气泡在水中向上浮一样,所以该算法也称为气泡排序法。
// 冒泡排序法
Function mysort( $ arr){
For($ i=0; $ i<count($ arr); $ i++){
For($ j=0; $ j<count($ arr)-1; $ j++){
If($ arr[$ j] > $ arr[$ j+1]){
$ tmp=$ arr[$ j];
$ arr[$ j]=$ arr[$ j+1];
$ arr[$ j+1]=$ tmp;
}
}
}
Return $ arr;
}
$ arr=array(3,2,1);
print_r(mysort($ arr));
使用PHP描述快速排序算法,对象可以是一个数组?
原理:快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。
//快速排序(数组排序)
function QuickSort($ arr){
$ num = count($ arr);
$ l=$ r=0;
for($ i=1;$ i<$ num;$ i++){
if($ arr[$ i] < $ arr[0]){
$ left[] = $ arr[$ i];
$ l++;
}else{
$ right[] = $ arr[$ i];
$ r++;
}
}
if($ l > 1){
$ left = QuickSort($ left);
}
$ new_arr = $ left;
$ new_arr[] = $ arr[0];
if($ r > 1){
$ right = QuickSort($ right);
}
for($ i=0;$ i<$ r;$ i++){
$ new_arr[] = $ right[$i];
}
return $new_arr;
}
使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
//二维数组排序, $ arr是数据,$ keys是排序的健值,$ order是排序规则,1是升序,0是降序
function array_sort($ arr, $ keys, $ order=0) {
if (!is_array($ arr)) {
return false;
}
$ keysvalue = array();
foreach($ arr as $ key => $val) {
$ keysvalue[ $ key] = $val[ $ keys];
}
if( $ order == 0){
asort( $keysvalue);
}else {
arsort( $keysvalue);
}
reset( $keysvalue);
foreach( $keysvalue as $key => $vals) {
$keysort[ $key] = $key;
}
$new_array = array();
foreach( $keysort as $key => $val) {
$new_array[ $key] = $arr[ $val];
}
return $new_array;
}
请以空格作为间隔,拆分字符串’Apple Orange Banana Strawberry’,组成数组$fruit, 数组中所有元素都用小写字母,并按照字母先后次序排序
class sort {
private $str;
public function __construct($str) {
$this->str=strtolower($str);
}
private function explodes() {
if(empty($this->str)) return array();
$arr=explode(" ",$this->str);
return is_array($arr)?$arr:array($arr);
}
public function sort() {
$explode=$this->explodes();
sort($explode);
return $explode;
}
}
$str='Apple Orange Banana Strawberry';
$sortob=new sort($str);
var_dump($sortob->sort());
对于用户输入一串字符串 s t r i n g , 要 求 string,要求 string,要求string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息
class regx {
public static function check($str) {
if(preg_match("/^([1-9,])+$/",$str)) {
return true;
}
return false;
}
}
$str="12345,6";
if(regx::check($str)) {
echo "suc";
} else {
echo "fail";
}
请写一段程序,在服务器创建一个文件fruit.dat,将试题3中得到的数组写入到改文件中,然后写一段程序从文件中读取并还原数组
class sort {
private $str;
public function __construct($str) {
$this->str=strtolower($str);
}
private function explodes(){
if(empty($this->str)) return array();
$arr=explode(" ",$this->str);
return is_array($arr)?$arr:array($arr);
}
public function sort() {
$explode=$this->explodes();
sort($explode);
return $explode;
}
}
class file {
private $sort=null;
private $filepath;
public function __construct($arrobj,$path) {
$this->sort=$arrobj;
$this->filepath=$path;
}
private function getresource($filename,$mode) {
return fopen($this->filepath.$filename,$mode);
}
private function closeresource($resource) {
fclose($resource);
}
public function savefile($filename) {
$arr=$this->sort->sort();
$fopen=$this->getresource($filename,"a+");
if(!$fopen){
echo "文件打开失败!";
exit;
}
var_dump($arr);
foreach($arr as $key=>$value) {
fwrite($fopen,$value."\n");
}
$this->closeresource($fopen);
}
public function readfile($filename) {
$this->savefile($filename);
$fopen=$this->getresource($filename,"r");
if(!$fopen){
echo "文件打开失败!";exit;
}
$arr=array();
while(!feof($fopen)) {
$get=fgets($fopen);
if(!empty($get))
$arr[]=str_replace("\n","",$get);
}
$this->closeresource($fopen);
return $arr;
}
}
$file=new file(new sort('Apple Orange Banana Strawberry'),"E:\\");
$arr=$file->readfile("fruit.dat");
var_dump($arr);
单例模式,创建mysqli数据库链接的单例对象
class Db {
private static $instance;
public $handle;
Private function __construct($host,$username,$password,$dbname) {
$this->handle=NULL;
$this->getcon($host,$username,$password,$dbname);
}
public static function getBb() {
self::$instance=new Db();
return self::$instance;
}
private function getcon($host,$username,$password,$dbname) {
if($this->handle!=NULL){
return true;
}
$this->handle=mysqli_connect($host,$username,$password,$dbname);
}
}
PHP session扩展默认将session数据储存在哪里? D
A) SQLite Database
B) MySQL Database
C) Shared Memory
D) File System
E) Session Server
如果你想要自动加载类,下面哪种函数声明是正确的 C
A) function autoload(KaTeX parse error: Expected group after '_' at position 27: … B) function _̲_autoload(class_name, KaTeX parse error: Expected group after '_' at position 20: …) C) function _̲_autoload(class_name)
D) function _autoload(
c
l
a
s
s
n
a
m
e
)
E
)
f
u
n
c
t
i
o
n
a
u
t
o
l
o
a
d
(
class_name) E) function autoload(
classname)E)functionautoload(class_name, $file)
PHP程序使用utf-8编码, 以下程序输出结果是什么? B
<?php
$str = ’hello你好世界’;
echo strlen($str);
?>
A) 9 B) 13 C) 18 D) 17
写一个函数,算出两个文件的相对路径
如 $a = ’/a/b/c/d/e.php’; $b = ’/a/b/12/34/c.php’;
计算出 $b 相对于 $a 的相对路径应该是 http://www.cnblogs.com/c/d将()添上
$a=”http://www.cnblogs.com/a/b/c/d/e.php”;
$b=”http://www.cnblogs.com/a/b/12/34/c.php”;
$ainfo=parse_url($a);
$binfo=parse_url($b);
$apath=ltrim($ainfo['path'],'/');
$bpath=ltrim($binfo['path'],'/');
$arr=explode('/',$apath);
$brr=explode('/',$bpath);
$count=count($arr);
for($i=0;$i<$count;$i++){
if($arr[$i]==$brr[$i]){
$brr[$i]='..';
}else{
break;
}
}
$cha=implode('/',$brr);
print_r($cha);
写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
function my_scandir($dir){
$files = array();
if ( $handle = opendir($dir) ){
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".." && $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
}else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
在PHP中error_reporting这个函数有什么作用?
error_reporting() 设置 PHP 的报错级别并返回当前级别。
如何修改SESSION的生存时间
方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2:$savePath = “./session_save_dir/”;
l
i
f
e
T
i
m
e
=
小
时
∗
秒
;
s
e
s
s
i
o
n
s
a
v
e
p
a
t
h
(
lifeTime = 小时 * 秒; session_save_path(
lifeTime=小时∗秒;sessionsavepath(savePath);
session_set_cookie_params(
l
i
f
e
T
i
m
e
)
;
s
e
s
s
i
o
n
s
t
a
r
t
(
)
;
方
法
3
:
s
e
t
c
o
o
k
i
e
(
)
a
n
d
s
e
s
s
i
o
n
s
e
t
c
o
o
k
i
e
p
a
r
a
m
s
(
lifeTime); session_start(); 方法3: setcookie() and session_set_cookie_params(
lifeTime);sessionstart();方法3:setcookie()andsessionsetcookieparams(lifeTime);
有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?
方法1(对于PHP5及更高版本):
$readcontents = fopen(“http://www.phpres.com/index.html”, “rb”);
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents(“http://www.phpres.com/index.html”);
写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名 例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php
答案1:
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(“.”,$file);
return $ext[1];
}
答案2:
function getExt($url) {
$url = basename($url);
$pos1 = strpos($url,”.”);
$pos2 = strpos($url,”?”);
if(strstr($url,”?”)){
Return substr($url,$pos1 + 1,$pos2 – $pos1 – 1);
} else {
return substr($url,$pos1);
}
}
使用五种以上方式获取一个文件的扩展名
要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,
必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数 get_ext1($file_name), get_ext2($file_name)
function get_ext1($file_name){
return strrchr($file_name, ‘.’);
}
function get_ext2($file_name){
return substr($file_name,strrpos($file_name, ‘.’));
}
function get_ext3($file_name){
return array_pop(explode(‘.’, $file_name));
}
function get_ext4($file_name){
$p = pathinfo($file_name);
return $p['extension'];
}
function get_ext5($file_name){
return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), ‘.’)));
}
<?php
$str1 = null;
$str2 = false;
echo $str1==$str2 ? ‘相等’ : ‘不相等’;
$str3 = ”;
$str4 = 0;
echo $str3==$str4 ? ‘相等’ : ‘不相等’;
$str5 = 0;
$str6 = ’0′;
echo $str5===$str6 ? ‘相等’ : ‘不相等’;
?>
相等 相等 不相等
求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
方法一:
<?php
class Dtime{
function get_days($date1, $date2){
$time1 = strtotime($date1);
$time2 = strtotime($date2);
return ($time2-$time1)/86400;
}
}
$Dtime = new Dtime;
echo $Dtime->get_days(’2007-2-5′, ’2007-3-6′);
?>
方法二:
<?php
$temp = explode(‘-’, ’2007-2-5′);
$time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
$temp = explode(‘-’, ’2007-3-6′);
$time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
echo ($time2-$time1)/86400;
方法三:echo abs(strtotime(“2007-2-1″)-strtotime(“2007-3-1″))/60/60/24 计算时间差
echo count(“abc”); 输出什么?
答案:1
count — 计算数组中的单元数目或对象中的属性个数
int count ( mixed$var [, int $mode ] ), 如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回1,有一个例外,如果 var 是 NULL 则结果是 0。
对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。
有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)
<?php
function BubbleSort(&$arr){
$cnt=count($arr);
$flag=1;
for($i=0;$i<$cnt;$i++){
if($flag==0){
return;
}
$flag=0;
for($j=0;$j<$cnt-$i-1;$j++){
if($arr[$j]>$arr[$j+1]){
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);
31、.以下的代码会产生什么?为什么?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由于函式 multiply() 没有指定 $num 为全域变量(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。
下面的类是否正确,如果正确请补全方法输入类属性 a ; 错 误 请 修 改 并 输 出 属 性 _a;错误请修改并输出属性 a;错误请修改并输出属性_a
<?php
Class A{
protected$a=1;
publicfunction test(){
echo$this->a;
}
}
答:
$a=new A;
$a->test();
请取出数组中的最大值?
$a=array(1,9,3,5,6,8);
$a=array(1,2,3,4,5,9);
答:
$b=max($a);
echo $b;
or
$a=array(1,9,3,5,6,8);
rsort($a);
Echo array_shift($a);
请问同时满足这样条件的数:被10除于9,被9除于8,被8除于7,在100—1000之间,有几个这样的数?(并写出算法)
A不存在,B 1个 C2个 D 3个
分析过程:
P除以10余9:P+1就被10整除
P除以9余8:P+1就被9整除
P除以8余7:P+1就被8整除
所以P=8,9,10的功倍数-1
8=222,9=33,10=25
则P+1一定是22233*5的倍数(只能约掉一个2 )
又100<=P<=1000
101<=P+1<=1001
所以P+1=360,720
所以P=359,719
写出一个简单的静态数组?
Class A{
Static $a=array('11'=>'1111');
}
Print_r(A::$a);
如何提高php应用的性能
1、 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、
r
o
w
[
’
i
d
’
]
的
速
度
是
row[’id’] 的速度是
row[’id’]的速度是row[id]的7倍。
3、echo 比 print快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo
s
t
r
1
,
str1,
str1,str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用
S
E
R
V
E
R
[
‘
R
E
Q
U
E
S
T
T
I
M
E
’
]
要
好
于
t
i
m
e
(
)
。
10
、
函
数
代
替
正
则
表
达
式
完
成
相
同
功
能
。
11
、
s
t
r
r
e
p
l
a
c
e
函
数
比
p
r
e
g
r
e
p
l
a
c
e
函
数
快
,
但
s
t
r
t
r
函
数
的
效
率
是
s
t
r
r
e
p
l
a
c
e
函
数
的
四
倍
。
12
、
如
果
一
个
字
符
串
替
换
函
数
,
可
接
受
数
组
或
字
符
作
为
参
数
,
并
且
参
数
长
度
不
太
长
,
那
么
可
以
考
虑
额
外
写
一
段
替
换
代
码
,
使
得
每
次
传
递
参
数
是
一
个
字
符
,
而
不
是
只
写
一
行
代
码
接
受
数
组
作
为
查
询
和
替
换
的
参
数
。
13
、
使
用
选
择
分
支
语
句
(
译
注
:
即
s
w
i
t
c
h
c
a
s
e
)
好
于
使
用
多
个
i
f
,
e
l
s
e
i
f
语
句
。
14
、
用
@
屏
蔽
错
误
消
息
的
做
法
非
常
低
效
,
极
其
低
效
。
15
、
打
开
a
p
a
c
h
e
的
m
o
d
d
e
f
l
a
t
e
模
块
,
可
以
提
高
网
页
的
浏
览
速
度
。
16
、
数
据
库
连
接
当
使
用
完
毕
时
应
关
掉
,
不
要
用
长
连
接
。
17
、
错
误
消
息
代
价
昂
贵
。
18
、
在
方
法
中
递
增
局
部
变
量
,
速
度
是
最
快
的
。
几
乎
与
在
函
数
中
调
用
局
部
变
量
的
速
度
相
当
。
19
、
递
增
一
个
全
局
变
量
要
比
递
增
一
个
局
部
变
量
慢
2
倍
。
20
、
递
增
一
个
对
象
属
性
(
如
:
_SERVER[‘REQUEST_TIME’]要好于 time()。 10、函数代替正则表达式完成相同功能。 11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。 12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。 13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。 14、用@屏蔽错误消息的做法非常低效,极其低效。 15、打开apache的mod_deflate模块,可以提高网页的浏览速度。 16、数据库连接当使用完毕时应关掉,不要用长连接。 17、错误消息代价昂贵。 18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。 19、递增一个全局变量要比递增一个局部变量慢2倍。 20、递增一个对象属性(如:
SERVER[‘REQUESTTIME’]要好于time()。10、函数代替正则表达式完成相同功能。11、strreplace函数比pregreplace函数快,但strtr函数的效率是strreplace函数的四倍。12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。13、使用选择分支语句(译注:即switchcase)好于使用多个if,elseif语句。14、用@屏蔽错误消息的做法非常低效,极其低效。15、打开apache的moddeflate模块,可以提高网页的浏览速度。16、数据库连接当使用完毕时应关掉,不要用长连接。17、错误消息代价昂贵。18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。19、递增一个全局变量要比递增一个局部变量慢2倍。20、递增一个对象属性(如:this->prop++)要比递增一个局部变量慢3倍。
21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
24、派生类中的方法运行起来要快于在基类中定义的同样的方法。
25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
(举例如下)
if (strlen(KaTeX parse error: Expected '}', got 'EOF' at end of input: …o is too short”$ }
(与下面的技巧做比较)
if (!isset(KaTeX parse error: Expected '}', got 'EOF' at end of input: …o is too short”$ }
调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
34、当执行变量
i
的
递
增
或
递
减
时
,
i的递增或递减时,
i的递增或递减时,i++会比++
i
慢
一
些
。
这
种
差
异
是
P
H
P
特
有
的
,
并
不
适
用
于
其
他
语
言
,
所
以
请
不
要
修
改
你
的
C
或
J
a
v
a
代
码
并
指
望
它
们
能
立
即
变
快
,
没
用
的
。
+
+
i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或 Java代码并指望它们能立即变快,没用的。++
i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
36、并非要用类实现所有的数据结构,数组也很有用。
37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
38、当你需要时,你总能把代码分解成方法。
39、尽量采用大量的PHP内置函数。
40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
45、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作;
46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
48、多维数组尽量不要循环嵌套赋值;
49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
50、foreach效率更高,尽量用foreach代替while和for循环;
51、用单引号替代双引号引用字符串;
52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
53、对global变量,应该用完就unset()掉。
谈谈asp,php,jsp的优缺点
ASP全名Active Server Pages,是一个WEB服务器端的开发环境, 利用它可以产生和运
行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script(Java script
)作为自己的开发语言。
PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法
, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝大多数数
据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点(http://www.php.ne
t)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。
JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病--
脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Jav
a 上的不凡造诣,将Java 从Java 应用程序 和 Java Applet 之外,又有新的硕果,就是Js
p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能强大的站点
程序。
三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。
但JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的
第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样式
,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 、PH
P、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到
HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP三者都是面向 Web 服务器的技术
,客户端浏览器不需要任何附加的软件支持。
说出常用的10个数组方法
我觉得数组比较最能体现PHP基础语法的一个数据结构了,下面给大家列一下常用的10个关于操作数组的函数
in_array(判断数组中是否有某个元素)
implode(将数组按照一定规律分解)
json_encode(将数组转化成json)
sort(排序,有很多排序的函数这里就说一个)
array_push(将一个活多个单元压入数组的末尾)
array_merge(合并数组)
array_key_exists(检查键名是否存在于数组中)
array_unique(去除数组中重复的值,只能对一位数组起作用)
array_shift(移除数组中第一个单元)
php有很多关于数组的函数,但常用的就是这几个了,可能我说的还不是很合适,但没什么大问题。需要注意的是,不要为了应付面试而盲目的死记硬背php的数组函数,你像array_pop这样的函数,你倒是知道这样的函数,笔试的时候也打出来了,但当面试官问你,你平时怎么用这个方法,你不就噎菜了吗?!所以要写平时常用的
说出平时常用的操作字符串的方法,并解决具体问题
同上,字符串操作也是php的基础用法,下面尽可能全的罗列一下平时常用的字符串操作
substr(截取字符串)
strlen(获取字符串长度)
strpos(查找字符串首次出现的位置)
str_replace(字符串替换)
explode(将字符串按照规律转化成数组)
strtoupper(将所有字母变成大写)
strtolower
ucfirst(将字符串的首字母变成大写)
ucwords(将字符串中每个单词的首字母变成大写)
strrev(反转字符串,其实不是很常用)
substr_replace(替换字符串的子串,注意与str_replace的区别)
strip_tags(去除html和php标记,可以选择保留想要的标签)
trim(去除空格)
explode(分割成数组)
这些是比较常用的了,肯定还有一些我没有列举出来,毕竟php的字符串函数比较多又或者其他的函数我用的不多。另外,记住这个函数并不是目的,目的是会用,笔试的时候可不是简单的问你这些函数的名字,那都是要做具体的例子的。现在时间比较紧,有时间一定会举出10个例子来分析的
恒等于 貌似不应该把这个当做一个单独的知识点来说,但这确实是笔试题中经常考到的
反正我平时没有主动用过这个东西一次。“”相比于"="不同的是,前者之比较值的大小,后者会比较数据类型。举例说明
if(1 == ‘1’){echo “it’s right”;}
if(1 === ‘1’){}
很明显,前者是正确的。因为这两个变量的类型不同
三元运算符
它的一般定义谁都会有,$a = 1 ? ‘one’ :0;但是有一次笔试我见了一个比较变态的题目,多个三元运算符和其他运算符联合在一起,让我不知道先执行哪一个,举例说明
echo (true?‘true’:false?‘t’:‘f’);这个问题曾一段让我很郁闷,到底先执行哪一个呢?首先,肯定是从左到右的,echo ((true ? ‘true’ : ‘false’) ? ‘t’ : ‘f’);这样就够清晰了吧,哈哈
记住这一原则就可
require和include的异同
这应该是让我们比较恶心的问题了,但这却也是经常考的问题
我们都知道的是require在执行出错时不会继续执行,include会继续执行,还有就是require一般放在文件的头部包含一个初始化文件之类的东西,而include一般是在语句中用到了那些文件包含过来
session和cookie
这也是面试中常问到的问题,最简单的回答常是session保存在服务端,大量的session会增大服务器的压力,cookie因为保存在客户端所以没有这些问题,但cookie因为这个特点所以相对来说不安全,这是我初学php的时候知道的
后来我知道了,session与cookie联系在一起是通过session_id联系起来的,而seesion_id是保存在cookie中的,这也就是为什么我清了cookie,session会失效的原因。当然我们也可以不将session_id保存在cookie里,一般大型网站不会将用户信息保存在session里,正如上面所说的因为会占资源,这时会将session保存在DB中,当然这也和集群有关,因为你如果使用了集群的话,会有多台服务器,你seesion保存在这台服务器上而处理的操作却通过另一台服务器的话就找不到session了。另外,session的过期时间,很多人都以为在php的配置文件中配置了就可以,其实这不是最好的方式,因为这个过期时间还取决于另一个参数,也就是过了这个你设置的时间session可能不会马上被清掉。所以我们将session保存在DB中。
面对对象
这几乎是每次面试都会问到的问题,而面试官又有几个能明白的呢?这里不详细介绍这个问题
对mvc的理解
这道是个不难理解的概念,现在只要是框架都用这种模式来处理问题了,mvc和smarty还不一样。smarty没有将m和c分开,也就是业务逻辑和控制器还是混在一起的,比较典型的例子就是ecshop。控制器controller负责调度数据,接受请求,具体处理数据的操作让模板model来完成,然后再通过控制器将值传给试图view
这是目前我考虑到的php常考的问题,后续会不断补充的
变量如何定义?如何检查变量是否定义?如何删除一个变量?判断一个变量是否为空的函数?
isset()
unset()
empty()
什么是可变变量?
一个变量的变量名可以动态的设置和使用。
$a = ‘hello’ , $$a = ‘world’, KaTeX parse error: Expected '}', got 'EOF' at end of input: {a}=hello world
变量赋值方式有哪几种?
1)直接赋值
2)变量间赋值
3)引用赋值
引用和拷贝有什么区别?
拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。
引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。
PHP中变量有哪些基本数据类型?
php支持8种原始数据类型。
包括:
四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string)
两种复合类型(数组array , 对象object)
两种特殊类型(资源resource,NULL)
其它类型转换为boolean类型时,哪些被认为是false?
布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串’0’, 空数组,特殊数据类型NULL, 没有设定的变量。
empty()函数在哪些情况下返回true?
布尔值false,
整型值0,
浮点型值0.0,
空白字符串,
字符串’0’,
array()空数组,
特殊数据类型NULL,
没有任何属性的对象,
没有赋值的变量。
如果定义了一个变量$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)
字符串怎么转成整数,有几种方法?怎么实现?
强制类型转换: (整型)字符串变量名;
直接转换:settype(字符串变量,整型);
intval(字符串变量);
标量数据和数组的最大区别是什么?
一个标量只能存放一个数据,而数组可以存放多个数据。
常量如何定义? 如何检测一个常量是否被定义?常量的值只能是哪些数据类型?
define()//定义常量 , defined()//检查常量是否定义
常量的值只能是标量类型的数据。
常量分为系统内置常量和自定义常量。请说出最常见的几个系统内置常量?
FILE , LINE , PHP_OS , PHP_VERSION
如果定义了两个相同的常量,前者和后者哪个起作用?
前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。
常量和变量有哪些区别?
1)常量前没有$符号;
2)常量只能通过define()定义,而不能通过赋值语句定义;
3)常量可以在任何地方定义和访问,而变量有全局和局部之分;
4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定义;
5)常量的值只能是标量数据,而变量的数据库类型有8种原始数据类型。
PHP中常用的几个预定义的全局数组变量是哪些?
有9大预定义的内置数组变量:
$_POST, $_GET, $_REQUEST, $_SESSION, $_COOKIE, $_FILES,$_SERVER, $_ENV, $GLOBALS
在实际开发中,常量最常用于哪些地方?
1)连接数据库的信息定义成常量,如数据库服务器的用户名、密码、数据库名、主机名;
2)将站点的部分路径定义成常量,如web绝对路径,smarty的安装路径,model、view或者controller的文件夹路径;
3)网站的公共信息,如网站名称,网站关键词等信息。
函数的优越性有哪些?
提高程序的可维护性
提高软件的可靠性
提高程序的可重用性
提高程序的开发效率
如何定义一个函数?函数名区分大小写吗?
1)使用 function 关键字;
2)函数命名规则和变量一样,以字母或者下划线开头,而不能以数字开头;
3)函数名不区分大小写;
4)函数名不可以使用已经声明过的或者系统自建的函数名称。
什么是变量的能见度 或者 说是变量作用域?
就是变量在程序中的可作用范围。根据变量的能见度,变量分为局部变量和全局变量。
什么是局部变量和全局变量?函数内是否可以直接调用全局变量?
局部变量是函数内部定义的变量,其作用域是所在的函数。如果函数外还有一个跟局部变量名字一样的变量,
程序会认为它们两个是完全不同的两个变量。当退出函数的时候,其中的局部变量就同时被清除。
全局变量是定义在所有函数以外的变量,其作用域是整个php文件,但是在用户自定义的函数内部是无法使用的。
如果一定要在用户自定义的函数内部使用全局变量,那么就需要使用global关键字声明。
也就是说如果在函数内的变量前加上golbal来修饰,那么函数内部就可以访问到这个全局变量,
不仅可以利用这个全局变量进行运算而且可以对这个全局变量进行重新赋值。
全局变量还可以使用 $GLOBALS[‘var’] 来调用。
什么是静态变量?
如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。
一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时,
该变量会在函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量
不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。
php中函数传递参数的方式有哪些?两者有什么区别?
按值传递和按地址传递(或按引用传递)
(1)按值传递: 待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对
该变量值做的修改,不影响原本的变量值。
(2)按地址传递: 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,
而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存
中是同一个。函数体做的修改,直接影响到函数体外部的该变量的值。
什么是递归函数?如何进行递归调用?
递归函数其实就是调用自身的函数,但是必须满足以下两个条件:
1)在每一次调用自身时,必须是更接近于最终结果;
2)必须有一个确定的递归终止条件,不会造成死循环。
举例说明:
在实际工作中往往会在遍历文件夹的时候使用。
如果有个例子是希望获取到目录windows下所有的文件,那么先遍历windows目录,如果发现其中还有文件夹,那么就会调用自身,继续往下寻找,依次类推,
直到遍历到再也没有文件夹为止,这也就是意味着遍历出来了所有的文件。
判断一个函数是否存在?
function_exists( string $function_name ) 如果存在,返回true, 不存在则返回 false。
func()和@func()之间有什么区别?
第二个函数调用失败不会报错,第一个会报错
include()和require()函数的用法和区别是什么?include_once()和require_once()呢?
控制流程语句有哪些?
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强大,只能终止本次循环而进入到下一次循环中。
数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种?
数组是一个可以存储一组或一系列数值的变量(复合型变量)
索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值)
数组的赋值方式有哪两种?
数组的声明方式主要有两种。
1.通过array()函数声明数组;
可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。
2.直接为数组元素赋值,不需要调用array()函数。例如:
$arr[0] = 1;
$arr[1] = 2;
特别注意:
数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。
例如: $array[3] 与 $array[‘3’] 引用的是相同的一个元素,而 $array[‘03’] 引用的则就是另外的一个元素了。
数组如何遍历?
①for循环
②foreach循环 ,这是最常用的遍历方式。用法如下:foreach($arr as
k
e
y
=
>
key=>
key=>value){}
③list each 和while 配合起来循环
foeach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢?
当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。
而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset().
reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。
如何计算数组长度(或者说计算数组中所有元素的个数)?字符串怎么取长度?
count() – 计算数组中的元素个数。
可以使用count(数组名)或者count(数组名,1),如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。
如果第二个参数是数字0,则等同于只有一个参数的count()函数。
sizeof() – count() 的别名
字符串:strlen()、mb_strlen();
数组中相关的常用函数有哪些?
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 ]) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。
数组合并函数array_merge()和数组加法运算$arr + $arr2 的区别是什么?
array_merge()->使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是
后者附加到前者后面。
“+”->使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃,
也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。
按照功能分类说说都有哪些字符串处理函数?这些函数的作用是什么?
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()
页面字符出现乱码,怎么解决?
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”)。
正则表达式是什么?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]] )
获取当前时间戳的函数主要有哪些?用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);//格式化为正常时间格式
在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?
用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入),php端接收数据的时候,应该如何处理?
使用urlencode()对中文进行编码,使用urldecode()来解码。
使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。
说说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);
请说出目前学过的返回是资源的函数?
mysql_connect();
mysql_query();只有这执行select的时候成功,才返回资源,失败返回FALSE
fopen();
文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?
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(),就可以完成
将文件保存到指定目录。
$_FILES是几维数组?第一维和第二维的索引下标分别是什么?批量上传文件的时候需要注意什么?
二维数组。第一维是上传控件的name,二维下标分别为name/type/tmp_name/size/error.
header()函数主要的功能有哪些?使用过程中注意什么?
答:头信息的作用很多,最主要的有下面几个:
1、跳转:当浏览器接受到头信息中的 Location: **x 后,就会自动跳转到 **x 指向的URL地址,这点有点类似用 js 写跳转。但是这个跳转只有浏览器知道,不管体内容里有没有东西,用户都看不到。
2、指定网页的内容:同样一个XML文件,如果头信息中指定:Content-type: application/xml 的话,浏览器会将其按照XML文件格式解析。但是,如果头信息中是:Content-type: text/xml 的话,浏览器就会将其看作存文本解析。(浏览器不是按照扩展名解析文件的)
3、附件:不知道大家有没有注意,有些时候在一些网站下载东西,点下载连接以后,结果浏览器将这个附件当成网页打开 了,里面显示的都是乱码,这个问题也和头信息有关。有时候浏览器根据Content-type 来判断是打开还是保存,这样有时就会判断错误(主要是网站设计者忘记写Content-type)。其实,还有一个可以来指定该内容为附件、需要保存,这 个就是:Content-Disposition: attachment; filename="**xx"
在PHP中如何写?
1、跳转:
header(“Location: http://www.example.com/”);
2、指定内容:
header(‘Content-type: application/pdf’);
3、附件:
// 指定内容为附件
header(‘Content-Disposition: attachment; filename=“downloaded.pdf”’);
// 打开文件,并输出
readfile(‘original.pdf’);
最后要提醒大家注意一点,所有头信息都必须在体内容之前,如果一旦有任何输出了的话,header函数写的 头信息就没用了。比如,在文件最开头的<?php 处,如果前面有空格或者有空行,那header函数就没用了(其实可以通过设置:output_buffer来解决,anyway),为什么这样,可以看 看HTTP协议,很简单。
文件下载的时候如果使用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);
什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么?
ajax是asynchronous JavaScript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。 '$'是jQuery的别名.
页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回给这个ajax引擎,
最后由这个ajax引擎来决定将返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。
这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,
减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
Ajax的优点是:
- 减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;
- 在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。
Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。
ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。
什么是会话控制?
简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,
系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。
目前最主要的会话跟踪方式有cookie,session。
会话跟踪的基本步骤
1).访问与当前请求相关的会话对象
2).查找与会话相关的信息
3).存储会话信息
4).废弃会话数据
使用cookie的注意事项有哪些?
1) setcookie()之前不可以有任何页面输出,就是空格,空白行也不可以;
2) setcookie()后,在当前页面调用$_COOKIE[‘cookiename’]不会有输出,必须刷新或到下一个页面才可以看到cookie值;
3) 不同的浏览器对cookie处理不同,客户端可以禁用cookie,浏览器也可以闲置cookie的数量,一个浏览器能创建的cookie数量最多300个,并且每个不可以超过4kb,
每个web站点能设置的cookie总数不能超过20个。
4) cookie是保存在客户端的,用户禁用了cookie,那么setcookie就不会起作用了。所以不可以过度依赖cookie。
使用session的时候,通过什么来表示当前用户,从而与其他用户进行区分?
sessionid,通过session_id()函数可以取得当前的session_id。
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的步骤:
- 启动session:
使用session_start()函数来启动。 - 注册会话:
直接给$_SESSION数组添加元素即可。 - 使用会话:
判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。 - 删除会话:
1.可以使用unset删除单个session;
2.使用$_SESSION=array()的方式,一次注销所有的会话变量;
3.使用session_destroy()函数来彻底销毁session。
cookie怎么使用?
- 记录用户访问的部分信息
- 在页面间传递变量
- 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。
创建cookie:
setcookie(string cookiename , string value , int expire);
读取cookie:
通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。
删除cookie:有两种方法
1.手工删除方法:
右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除。
2.setcookie()方法:
跟设置cookie的方法一样,不过此时将cookie的值设置为空,有效时间为0或小于当前时间戳。
如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效?
一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少?
setcookie(‘username’,’jack’,time()+7243600);
最多可以产生20个cookie,每个最多不超过4K
设置或读取session之前,需要做什么?
可以直接在php.ini中开启session.auto_start = 1或者在页面头部用session_start();
开启session,session_start()前面不能有任何输出,包括空行。
在实际开发中,session在哪些场合使用?
session用来存储用户登录信息和用在跨页面传值。
1)常用在用户登录成功后,将用户登录信息赋值给session;
2)用在验证码图片生成,当随机码生成后赋值给session。
注销session会话的形式有几种?
unset()
$_SESSION=array();
session_destroy();
什么是OOP?什么是类和对象?什么是类属性?
OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象。
世间万物都具有自身的属性和方法,通过这些属性和方法可以区分出不同的物质。
属性和方法的集合就形成了类,类是面向对象编程的核心和基础,
通过类就将零散的用于实现某个功能的代码有效地管理起来了。
类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,
类在实例化之后就是对象。★类是对象的抽象概念,对象是类的实例化。
OOP具有三大特点:1. 封装性(又叫做隐藏性);2. 继承性; 3. 多态性。
OOP的优点:1、代码重用性高(省代码) 2、使程序的可维护性高(扩展性) 3、灵活性
常用的属性的访问修饰符有哪些?分别代表什么含义?
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
$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?
$this 当前对象
self 当前类
parent 当前类的父类
$this在当前类中使用,使用->调用属性和方法。
self也在当前类中使用,不过需要使用::调用。
parent在类中使用。
类中如何定义常量、如何类中调用常量、如何在类外调用常量。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。
定义常量使用关键字const.
例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,
访问常量的格式都是类名加作用域操作符号(双冒号)来调用。
即:类名 :: 类常量名;
作用域操作符::如何使用?都在哪些场合下使用?
调用类常量
调用静态方法
什么是构造方法和析构方法?
构造方法就是在实例化一个对象的同时自动执行的成员方法,作用就是初始化对象。
php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()就是构造方法。
如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数,
没有任何操作。
构造方法的格式如下:
function __construct(){}
或者:function 类名(){}
构造方法可以没有参数,也可以有多个参数。
析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。
析构方法的定义方法为:__destruct();
因为php具有垃圾回收机制,能自动清除不再使用的对象,释放内存,一般情况下可以不手动创建析构方法。
Java语言中方法重写和重载分别代表什么意思?准确说php支持方法的重载吗?很多参考书中提到的php重载实际上该如何正确理解?
php不支持方法的重载,很多书里提到的PHP‘重载’应该是‘重写’
final关键字能定义类中的成员属性吗?
答:不能,类的成员属性只能有public ,private , protected ,var 来定义
final关键字定义的类能够被继承吗?
答:final定义的类不能被继承
说说static关键字的使用场合?static能用在class前吗?
static可以跟public,protected,private一起使用吗?构造方法可以是static的吗?
答: static可以在属性和方法前面使用,调用static属性或者方法时,只要将类载入就可用,不用实例化
static不能用在class的前面
static可以跟public,protected,private一起使用,在方法的前面;
▲构造方法不能是static
接口可以实例化吗?抽象类能实例化吗?
答:接口和抽象类都不能被实例化
class前面能加访问修饰符吗?如果能加,只能是哪几个访问修饰符?可以是权限访问修饰符public,protected,private吗?
答:class前面可以加final,static;
★class前面不能加public,protected,private
类中属性前可以不加访问修饰符吗?成员变量前的修饰符只能是public,protected,private吗?还可以是哪几个?
答:类中的属性必须加修饰符,除了那3个以外,还可以加var
如果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是一样的
__tostring()魔术方法在什么时候被自动执行? __tostring()魔术方法必须要return返回值吗?
当echo或者print一个对象时,就是自动触发。而且__tostring()必须要返回一个值
什么是抽象方法?
答:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有
如果一个类中有一个方法是抽象方法,而这个类没有定义成抽象类,会报错吗?
答:会,“Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in”
如果一个类是抽象类,而类中的方法都是非抽象的方法,会报错吗?
答:不会报错,如果一个类是抽象类,其中可以没有抽象方法,但是一个类中有个方法是抽象方法,那么这个类一定是一个抽象类
final 关键字的应用应注意的问题?
使用final关键字定义的类,禁止继承。
使用final关键字定义的方法,禁止重写。
如果一个类既要继承一个父类,又要实现多个接口,该如何写?
书写格式例如: class MaleHuman extends Human implements Animal,Life { … }
什么是单点入口呢?
所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,
比如说在上面我们就使用index.php作为程序的单点入口,当然这个是可以由你自己任意控制的。
单点入口有几大好处:
第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面
第二、程序的架构更加清晰明了。
PHP提供了2套正则表达式函数库,分别是哪两套?
(1) PCRE Perl兼容正则表达式 preg_ 为前缀
(2) POSIX 便携式的操作系统接口 ereg_ 为前缀
正则表达式的组成?
由原子(普通字符,如英文字符)、
元字符(有特殊功用的字符)
模式修正字符
一个正则表达式中,至少包含一个原子
不常用魔术方法的触发时机?
__isset() __unset()的触发时机
__sleep()、 __wakeup() 在对对象进行串行化的时候调用
如果序列化对象的时候,不写__sleep()方法,则所有的成员属性都会被序列化,而定义了__sleep()方法,则只序列化指定数组中的变量。
因此,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
OOP的三大特性是什么?
-
封装性:
也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。
于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,
实现代码模块间松藕合。 -
继承性:
就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。
php只支持单继承,也就是说一个子类只能有一个父类。 -
多态性:
子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。
于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。
多态性增强了软件的灵活性。
常见框架
thinkPHP
yii
ZendFramework
CakePhp
sy
常用魔术方法的触发时机?
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()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。
什么是无限极分类?
要实现无限极分类,数据库建表是关键。
表结构中至少需要三个字段,如果想避免递归循环,那么需要四个字段。
- id ,当前数据的唯一标识;
- typename ,类型名称;
- parentid , 当前类型的上一层父类型的id;
- path , 其中存储当前类型的id和它所有父级类型的id。
这些id之间采用“-”隔开。 - 当通过以下sql语句就可以实现,相同顶级类下的信息都在一起集中显示。
select * from 表名 where 条件 order by path;
分页原理是什么?
数据分页需要以下几个条件:
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;
写出关于文件上传的相关函数?
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()
如何将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和值以及失效时间。
常用的正则表达式写法:
中文:/^[\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~!@#$%^&(){}]*)$/
Memcached含义
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。