66.
什么是
OOP?
什么是类和对象?什么是类属性?
OOP(object oriented programming)
,即面向对象编程,其中两个最重要的概念就是类和对象。
世间万物都具有自身的属性和方法,通过这些属性和方法可以区分出不同的物质。
属性和方法的集合就形成了类,类是面向对象编程的核心和基础,
通过类就将零散的用于实现某个功能的代码有效地管理起来了。
类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,
类在实例化之后就是对象。★
类是对象的抽象概念,对象是类的实例化。
OOP
具有三大特点:
1.
封装性(又叫做隐藏性);
2.
继承性;
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
层。
80. oop
中的多态性跟方法重写有什么关系?
答:
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
的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
100. OOP
的三大特性是什么?
1.
封装性:
也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。
于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现
MVC
分工合作,也能有效避免程序间相互依赖,
实现代码模块间松藕合。
2.
继承性:
就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。
php
只支持单继承,也就是说一个子类只能有一个父类。
3.
多态性:
子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。
于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。
多态性增强了软件的灵活性。
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
。
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;
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~!@#$%^&(){}]*)$/