1. 什么是变量?
变量:在程序执行期间可以变化的量,通过变量保存值。
示例:
$a='aaa';
echo $a;
2.什么是函数?
函数:函数就是把一段重复使用的代码放到一个结构里进行包裹,后期可以通过函数名字直接重复调用
示例:
function display()
{
echo 'hello world';
}
display();
3.什么是对象?
对象:某类事务的具体代表,也是实际数据和功能操作的具体单元,也被称之为实例
4.什么是属性?
属性:本质是在类class结构中创建的变量,也称之为成员变量
示例:
public $money=10;
5.什么是方法?
方法:给对象调用解决问题的函数
示例:
public function display(){
echo __CLASS__;
}
6.什么是类?
类:是定义面向对象主体的最外层结构,用来包裹主题的数据和功能(函数)。类是以来具有共性事务的代表,代表的是事务的共性。比如说人类
示例:
class fun
{
public $money = 10;
public function display()
{
echo __CLASS__;
}
}
7.什么是面向对象?什么是面向过程?
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为
8.如何声明类?
示例:
public class 类名{
...//代码段
}
9.什么叫变量初始化?
变量初始化:给变量设置一个默认值(或者是需要的值)
注意:
(1).布尔类型的变量默认值是FALSE
(2).整形和浮点型变量默认值是0
(3).字符串型变量默认值是空字符串
(4).数组变量的默认值是空数组
10.什么是类的实例化?
类的实例化:将类中的属性和方法拿出来用
示例:
class fun{
public function display(){
echo __CLASS__;
}
}
$a=new fun();
11.怎么在外部调用属性?
答:使用符号->
示例:
class fun{
public $apple=5;
}
$a=new fun();
echo $a->apple;
12.怎么在外部调用方法?
答:和调用属性类似,也是使用符号->
示例:
class fun{
public function display(){
echo __CLASS__;
}
}
$a=new fun();
$a->display();
13.怎么在类的内部调用属性或者方法?
在类的内部调用属性和方法:使用$this
示例:
class Saler{
public $money=100;
public $count=100;
public function getAll(){
echo $this->money,$this->count;
}
}
$a= new Saler();
$a->getAll();
14.传递赋值和引用赋值的特点
传值赋值:将一个变量的值赋给另一个变量,两个值互不干扰
示例:
$a1=234;
$a2=34556;
$a1=$a2;
$a2=123;
echo $a1,'<br>'; //输出34556
echo $a2; //输出123
引用赋值:将变量的引用复制出来一份(新的引用还是指向原来的值),会互相影响
示例:
$a=123;
$b=&$a;
$a=321;
echo $b; //输出321
15.什么是封装?
封装:将数据和对数据的操作捆绑到一起,形成对外界的隐蔽,同时对外提供可以操作的接口
16.Public,protected,private这三个关键字的作用范围是什么?
public:共有,类内和类外都可以访问
protected:受保护,只允许在相关类内部访问
private:私有,只允许在定义类内部访问
17.什么是构造函数?构造函数的特点是什么?
构造函数:是对象实例化的时候用来初始化对象的资源的,通常用来初始化对象的属性或者其他资源初始化
特点:类在实例化对象之后,对象就会自动调节
示例:
class Saler{
public function __construct(){
echo __CLASS__;
}
}
18.什么是析构函数?析构函数的特点是什么?
析构函数:是用来对象销毁时主动释放资源的
特点:对象销毁后或者脚本执行结束后自动执行
示例:
class Saler{
public function __destruct(){
echo __CLASS__;
}
}
19.怎么定义静态方法和属性?静态属性和方法有什么特性?
定义静态属性和方法:在属性和方法前加上static
关键字
特性:静态属性和方法不需要实例化就可以调用
20.怎么在外部调用静态方法和属性?怎么在静态方法中调用静态方法或者属性?
在外部调用静态属性:使用类+范围解析操作符+静态属性
示例:
class Saler{
public static $money=1;
}
echo Saler::$money;
在外部调用静态方法:使用类+范围解析操作符+静态方法名字()
示例:
class Saler{
public static function showClass(){
echo __CLASS__;
}
}
Saler::showClass();
在类内部调用静态成员:使用类名+范围解析操作符+静态属性/静态方法()
示例:
class Saler{
private static $money=10;
public static function showClass(){
echo Saler::$money;
}
}
Saler::showClass();
21.怎么定义常量?常量有什么特性?怎么调用?
定义常量及调用
(1).define()函数定义常量
示例:
define('NAME','king');
echo '用户名为:',NAME;
(2).const()关键字定义常量
示例:
const WEB='king';
echo WEB;
特性:常量作用域是全局;常量一经定义,在脚本执行期间是不能改变的;常量的值可以是标量类型,也可以是数组
22.什么叫作属性重载?有哪几种类型?
属性重载:当对象访问不存在的或者权限不够的属性的时候,自动触发的魔术方法让代码不出错(容错处理)
(1).__get
(属性名):访问不存在或者权限不够的属性时触发
(2).__set
(属性名,属性值):设置不存在或者权限不够的属性时触发
(3).__isset
(属性名):判定不存在或者权限不够的属性时触发
(4).__unset
(属性名):删除不存在或者权限不够的属性时触发
示例:
class Man
{
private $age = 10;
#读取重载
public function __get($key)
{
echo $key, __METHOD__, '<br/>';
}
#写重载
public function __set($key, $value)
{
echo $key . ':' . $value . '<br/>';
}
#查看是否存在重载
public function __isset($key)
{
echo $key, __METHOD__, '<br/>';
}
#删除属性重载
public function __unset($key)
{
echo $key, __METHOD__, '<br/>';
}
}
#实例化
$m = new Man();
$m->age; # 类外访问私有属性
$m->age = 100; # 设置
isset($m->age); # 判定
unset($m->age); # 删除
22.什么叫作方法重载?有哪几种类型?
方法重载:对象或者类访问不存在或者权限不够的方法时,自动触发的魔术方法让代码不出错(容错处理)
(1).__call
(方法名,方法参数列表):调用不存在或者权限不够的方法时触发(针对普通方法)
(2).__callStatic
(方法名,方法参数列表):调用不存在或者权限不够的静态方法时触发(针对静态方法)
示例:
<?php
class Man
{
private function show()
{
echo __METHOD__, '<br/>';
}
private static function staticShow()
{
echo __METHOD__, '<br/>';
}
#普通方法重载
public function __call($name, $args)
{
echo $name, __METHOD__, '<br/>';
}
#静态方法重载
public static function __callstatic($name, $args)
{
echo $name, __METHOD__, '<br/>';
}
}
#访问不可访问的方法
Man::staticShow();
$m = new Man();
$m->show();
23.什么是继承?继承的注意点有哪些?三个关键词的可见性约束(也就是作用范围)是什么样子的?
继承:子类合法拥有父类某些权限
注意:
(1).继承必须满足继承关系:即存在合理的包含关系
(2).子类想要继承父类,则必须在子类结构申明时明确使用extends
关键字类继承相关类
(3).对于子类继承父类的protected/public
属性/方法
a.父类有的,子类继承
b.父类有的,子类可以更改
c.父类没有的,子类可以添加
(4).对于继承pricate类型的属性/方法,比较特殊,可以继承过来,但是有个标记,标记其从属父类而来,即在子类内是无权调用继承过来的私有属性/方法的
(5).子类继承父类时,权限要求严格,只能越来越宽松或者不变,不能越来越严格
24.什么叫重写?重写的特点或者注意点有哪些?
重写:子类中定义与父类重名的成员
注意
(1).私有属性或方法无法被重写
(2).子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放
(3).子类重写方法时,参数要求与父类一致
(4).在方法参数一致不单单要求数量一致,而且数据类型要求也必须相同,但形参名字可以不同
(5).重写父类成员之后,子类只会直接访问子类的成员(覆盖)
(6).不管时共有还是受保护属性,一旦重写,父类的就会不存在
(7).静态成员也可以被重写,但是静态属性不会被覆盖(属于类,不属于对象)
25.重写了父类方法之后,如何继续调用父类方法?
答:子类重写父类方法之后,相当于子类将父类的公有和受保护的方法覆盖,所有想要调用父类方法的话可以直接调用子类同名方法,当然私有方法除外
26.如何禁止父类方法被重写?
答:在方法前加入关键字final
示例
#父类
class Human
{
public function show(){} #普通方法
public final function walk(){} #最终方法
}
#子类
class Man extends Human {
#重写
public function show(){} #没问题
public function walk(){} #致命错误:不能重写父类中的最终方法
}
27.抽象方法有哪些特点或者特征?抽象方法如何定义?
抽象方法特征:没有实现体,而且私有方法不会被继承;抽象方法的类必须声明为抽象类
定义:
abstract class Human{
abstract public function eat(); #没有方法体,即没有后面的大括号
}
28.普通的类和抽象类,在继承抽象类的时候有什么区别?
答:抽象类继承抽象类可以正常继承,但是普通类继承抽象类后,如果抽象类中有抽象方法,那么普通类必须选择自己成为抽象类或者实现抽象方法(所有抽象方法)
示例:
abstract class Human{
#定义抽象方法:没有方法体
abstract public function eat();
public function show(){} #普通方法有方法体
}
#子类1:抽象类继承抽象类
abstract class Man extends Human{} #正常继承
#子类2:普通类继承抽象类(普通类实现父类所有抽象方法)
class Boy extends Man{
#实现从祖父类继承的eat抽象方法
public function eat(){
echo 'eat';
}
}
29.public,abstract,final,static这几个关键字的书写顺序是什么样子的?
public
,abstract
,final
,static
的书写顺序如下:
abstract class Human{
abstract public static function eat();
}
注意:不能在抽象类成员上使用final
修饰符,否则会报致命错误!!!
30.什么是接口?接口有哪些注意事项?
接口:专门用来规范一些共性类必须实现的方法
注意事项:
(1).接口不能实例化,类可以实现接口
(2).使用interface
和implements
两个关键字相照应使用
(3).接口会使得项目的开发变得不那么灵活,所有要选择性使用接口
a.小型项目:接口的增加会导致PHP的灵活性和快捷性受阻,因此很少使用接口
b.大型项目:接口的增加会很好的规范团队的协作,比较多用接口
(4).接口内的方法不能有实现体
31.怎么定义一个接口?
定义接口:使用interface
关键字,后跟接口名字(与类结构一样)
interface Human{}
32.怎么实现一个接口?
实现接口:接口是用来规范类必须完成的事情,所以接口只能被类实现:implements
class Man implements Human{}
33.接口怎么继承接口?B接口继承了A接口。怎么实现B接口?
接口继承接口:
interface A{}
interface B{}
#接口继承
interface C extends A{}
#接口多继承
interface D extends A,B{}
注意:当接口B继承了A接口,实现B接口的话需要定义一个类,然后使用关键字implements
加B接口的类名进行实现,如下:
class C implements B{}
34.怎么用一个类实现多个接口?
一个类实现多个接口:创建一个新的接口继承多个接口,然后用类去实现这个新的接口,具体如下:
interface A{}
interface B{}
interface C{}
#创建一个新的接口去继承上面的三个接口
interface D extends A,B,C{}
#用类实现接口
class Man implements D{}
35.怎么用一个类实现多个接口的时候再继承另一个类?
答:如34题所示已经实现了用一个类实现多个接口的操作,再继承另一个类可以使用继承关键字extends
来实现,如下:
interface B{}
interface C{}
class E{
public function fun(){
echo __METHOD__;
}
}
#创建一个新的接口去上面的三个接口
interface D extends A,B,C{}
#用类实现接口并继承
class Man extends E implements D{}
36.怎么确定一个PHP变量是否属于某一类class的实例?
答:使用关键字instanceof
,查看返回结果是true
还是false
class MyClass{}
class NotMyClass{}
$a = new MyClass;
var_dump($a instanceof MyClass); //返回true
var_dump($a instanceof NotMyClass); //返回false
37.function f(类名 $p){} 这是什么意思?
function f(类名 $p){} //要求参数只能使用该类的对象
38.function f(接口名 $p){} 这是什么意思?
function f(接口名 $p){} //要求该参数只能使用实现该接口的对象
39.function f(arrary $p){} 这是什么意思?
function f(arrary $p){} //要求该参数只能使用数组
40.什么是自动加载?自动加载的执行顺序是什么样的?怎么实现自动加载?
实现自动加载:使用魔术函数或者自定义函数实现
(1).魔术函数__autoload()
:系统自动调用,需要传入类名,在函数内部实现类的手动加载
function __autoload($classname){
#找到对应的文件路径和命名规范,手动加载
}
(2).自定义函数:自己定义类的加载实现,然后通过spl_autoload_register
注册到自动加载机制(可以注册多个自动加载)
function 自定义函数($classname){
#找到对应的文件路径和命名规范,手动加载
}
#注册自动加载
spl_autoload_register('自定义函数名字');
41.什么是命名空间?可以解决什么问题?有哪些注意事项?
命名空间:namespace
,指人为的将内存进行分隔,让不同内存区域的同名结构共存,从而解决在大型项目中可能出现的重名结构问题
注意事项:
(1).使用namespace
关键字定义空间
namespace 命名空间名字;
(2).命名空间必须定义在所有代码之前(前面不能有任何代码性的内容,注释除外)
(3).命名空间后可以写任意内容,但是只有命名空间元素真正受空间限制
(4).命名空间元素是结构性内容(不允许重复的内容),有三类:常量;函数;类(接口)
42.写一个不使用命名空间会报错的例子
示例:
function display(){
echo __CLASS__;
}
function display(){
echo __CLASS__;
}
43.使用命名空间解决上面这个问题的报错
示例:
#定义空间
namespace space1; #后续所有结构性内容理论上都属于space1
function display(){
echo __CLASS__;
}
#新建第二个空间:第一个空间到此结束,后续内容属于第二个空间space2
namespace space2;
function display(){
echo __CLASS__;
}
44.声明命名空间的写法有哪几种?
声明命名空间的写法有两种
第一种:
namespace MyProject1;
/*内容代码*/
第二种
namespace MyProject2{
/*内容代码*/}
45.调用不同命名空间下的方法的写法?
(1).非限定名称:直接访问元素名,系统自动匹配当前空间(向上找到的第一个空间)
示例
namespace space1;
function display(){
echo 'space1';
}
namespace space2;
function display(){
echo 'space2';
}
display(); #输出spaces2,因为当前display函数电泳所属空间为space2
(2).限定名称 :带空间名字,而且是基于当前空间的子空间(相对路径,在当前空间下,找到向下的空间)
示例
#定义子空间
namespace space\space1;
function display(){
echo 'space\space1';
}
#定义子空间
namespace space\space2;
function display(){
echo 'space\space2';
}
#所属父空间
namespace space;
function display(){
echo 'space';
}
space1\display(); #输出space\space1:实际为当前空间space + space1\display()
(3).完全限定名称 :从全局空间(根目录)开始访问(绝对路径)
示例
#接上述代码
#完全限定名称访问
\space\display(); #space空间下的display
\space\space1\display(); #space下space1空间的display
46.假如命名空间内的方法和全局方法或者常量冲突,怎么调用全局下的方法和常量?
答:可以使用别名来解决。
注意:使用别名后,原来的名字在当前就不可用,只能使用别名
use [元素关键字] 空间命\方法名或常量名 as 别名;
47.怎么定义子命名空间?
子空间可以基于已有空间创建,也可以之间创建,使用反斜杠分隔 \
示例
#基于已有父空间
namespace father;
namespace father\son;
#直接创建子空间
namespace mother\daughter;
48.怎么才能知道当前是在哪个命名空间内?
答:可以使用魔术常量__NAMESPACE__
来检测
示例
namespace space\space1;
function display(){
echo 'space\space1';
}
#检测当前所在的命名空间
echo __NAMESPACE__,'<hr/>'; //输出当前命名空间:space\space1
namespace space\space2;
function display(){
echo 'space\space2';
}
#检测当前所在的命名空间
echo __NAMESPACE__,'<hr/>'; //输出当前命名空间:space\space2
49.怎么样导入类?
答:使用use
导入
示例
function myLoader($name){
echo '加载的类为:',$name;
exit();
}
spl_autoload_register('myLoader',true,);
#导入空间要求使用完全限定名称,不要第一个用反斜杠
use A\B\MyClass;
$a=new MyClass(); //输出:加载的类为:A\B\MyClass
50.怎么给导入的类取别名?
答:使用关键字as
示例
function myLoader($name){
echo '加载的类为:',$name;
exit();
}
spl_autoload_register('myLoader',true,);
#导入空间要求使用完全限定名称,不要第一个用反斜杠
use A\B\MyClass as M;
$a=new M();
51.怎么导入函数?
答:与导入类的方法大同小异,同样是使用关键字use
,不同的是要在use
后加上function
。常量同理,在use
后加上const
示例
namespace A\S\D;
function func(){
echo '函数方法';
}
#常量
const num=123;
#导入函数方法
use function A\S\D\func;
func();
#导入常量
use const A\S\D\num;
echo num;
52.导入类和导入函数,常量的区别是什么?
答:导入函数和常量不能像导入类和空间一样多个连在一起导入
示例
#导入多个类
use A\B\MyClass,C\D\Test;
$a=new MyClass();
$b=new Test();
#导入多个函数和常量
use function A\S\D\func,const A\S\D\num; //错误!!!