《高级Web后台开发》复习
《高级Web后台开发》复习
一、单选题
1.如何声明一个PHP的用户自定义类?( B )
A.<?php B.<?php
class Class_name() { } class Class_name { }
?> ?>
C.<?php D.<?php
function Function_name { } function Function_name () { }
?> ?>
2.下面哪一项不是PHP中面向对象的机制?( D )
A.类 B.属性、方法 C.单一继承 D.多重继承
3.如何让一个对象实例调用自身的该对象的方法函数“mymethod”?( A )
A.$self=>mymethod(); B.$this->mymethod();
C.$current->mymethod(); D.$this::mymethod();
4.下面哪项描述是错误的?( A )
A.父类的构造函数与析构函数不会自动被调用
B.成员变量需要用public protected private修饰,在定义变量时不再需要var关键字
C.父类中定义的静态成员,不可以在子类中直接调用
D.包含抽象方法的类必须为抽象类,抽象类不能被实例化
5.如果成员没有声明限定字符,属性的默认值是( C )。
A.private B.protected C.public D.final
6.PHP中调用类文件中的$this表示( A )。
A.用本类生成的对象变量 B.本页面
C.本方法 D.本变量
7.在PHP的面象对象中,类中定义的析构函数是在( C )调用的。
A.类创建时 B.创建对象时 C.删除对象时 D.不自动调用
8.以下是一个类的声明,其中有两个成员属性,对成员属性正确的赋值方式是( B )。
<?php
class Demo {
private $one;
static $two;
function setOne($value) {
$this->one=$value;
}
}
$demo=new Demo();
?>
A.$demo->one="abc"; B.Demo::$two="abc";
C.Demo::setOne("abc"); D.$demo->two="abc";
9.在PHP 5的类的定义中,无法使用3P修饰的内容是( D )。
A.属性 B.静态方法 C.常量 D.方法
10.在PHP 5的类的定义中,如果方法M1能够调用方法M2,但M2不能调用M1,那么M1和M2应该符合( A )。
A.M2是静态方法而M1不是 B.M1是静态方法而M2不是
C.M1和M2都是静态方法 D.M1和M2都不是静态方法
11.以下四条接口与抽象类的对比分析,哪条是错误的?( B )
A.接口和抽象类都可以只声明方法而不实现它
B.抽象类可以定义类常量,而接口不能
C.抽象类可以实现具体的方法,而接口不能
D.抽象类可以声明属性,而接口不能
12.要实现PHP 5在面向对象编程方面最令人激动的自动加载功能,我们可以( A )。
A.定义函数名为__autoload()的自动加载函数
B.通过php.ini或者ini_set()设置自动加载目录
C.在编译PHP 5时加上默认未激活的模块
D.使用spl_autoload_register()函数和相关函数来指定自动加载函数
13.针对PHP 5中特有的魔法方法(Magic Methods),下列四句中哪句是错误的?( A )
A.__get和__set方法用于设置并不存在的类实例的属性成员
B.__call和__invoke方法用于调用并不存在的类的方法成员
C.__sleep和__wakeup方法用于在序列化类实例时处理其中的外部资源和冗余数据
D.通过__get方法,我们可以实现类的只读属性,而__set方法可以实现只写属性
14.如果你想要自动加载类,下面哪种函数声明是正确的?( C )
A.function autoload($class_name) B.function __autoload($class_name, $file)
C.function __autoload($class_name) D.function _autoload($class_name)
E.function autoload($class_name, $file)
15.以下哪段代码能正常执行?( D )
A.abstract class boo{ B.abstract class boo{
abstract function func(); function func();
} }
class coo extends boo{ class coo extends boo{
abstract function func(){} function func(){}
} }
$coo = new coo(); $coo = new coo();
C.class boo{ D.abstract class boo{
abstract function func(); abstract function func();
} }
class coo extends boo{ class coo extends boo{
function func(){} function func(){}
} }
$coo = new coo(); $coo = new coo();
16.下面哪些说法是错误的?( A )
A.如果一个类的成员前面有访问修饰符private,那么这些成员不能被继承,并且在类的外部可见。但如果类的成员被指定为protect或public,则可以被继承,在类的外部也是可见的
B.PHP 5中,final关键字可以禁止继承和重载
C.PHP 5中,析构函数的名称是__destruct(),并且不能有任何参数
D.继承接口的类必须实现接口中声明的所有方法,在PHP中,如果继承接口的类没有实现接口中指定的方法,将会产生一个致命的错误
17.执行以下代码,输出结果是( C )。
<?php
abstract class a{
function __construct(){
echo “a”;
}
}
$a=new a();
?>
A.a B.一个错误警告 C.一个致命性的报错 D.无输出
18.执行以下代码,输入结果是( D )。
<?php
class a{
function __construct(){
echo “echo class a something”;
}
}
class b extends a{
function __construct(){
echo “echo class b something”;
}
}
$a=new b();
?>
A.echo class a something echo class b something
B.echo class b something echo class a something
C.echo class as something
D.echo class b something
19.哪种OOP设置模式能让类在整个脚本里只实例化一次?( D )
A.MVC B.代理模式 C.抽象工厂模式 D.单件模式
20.借助继承,我们可以创建其他类的派生类。那么在PHP中,子类最多可以继承几个父类?( A )
A.1个 B.2个 C.取决于系统资源 D.想要几个有几个
二、简答题
1.如何访问和设置一个类的属性?
<?php
class A{
public $name = “A”;
}
$a = new A();
n=a->name;
print_r($n);
2.PHP中有哪些常用的魔术方法?说明其用法。
__sleep serialize 之前被调用
__wakeup unserialize 时被调用
__toString 打印一个对象时被调用
__set_state 调用 var_export 时被调用,用__set_state的返回值作为 var_export 的返回值
__construct 构造函数,实例化对象时被调用
__destruct 析构函数,当对象销毁时被调用
__call 对象调用某个方法,若存在该方法,则直接调用,若不存在,则调用__call 函数
__get 读取一个对象属性时,若属性存在,则直接返回,若不存在,则调用__get 函数
__set 设置一个对象的属性时,若属性存在,则直接赋值,若不存在,则调用__set 函数
__isset 检测一个对象的属性是否存在时被调用
__unset unset 一个对象的属性时被调用
__clone 克隆对象时被调用
__autoload 实例化一个对象时,如果对应的类不存在,则该方法被调用
3.简述public,protected,private,static,const和final的区别和调用方式。
1.public(公共的)
表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2.protected(受保护的)
是受访问权限显示的,不同包中的非子类是不能访问的 default 是受访问权限显示的,不同包中的子类不能访问
3.private(私有的)
必须要同一类才能访问 static 一个类的成员被声明为static时,他属于一个类,可以通过类名被访问,不需创建实例用
4.static(静态)
static属性定义的方法为类方法,可以通过类名来调用,不需创建实例 final 用final修饰的变量为常值变量,一旦初始化,不能更改通常final与static一起使用指定一个类常量用final修饰的方法为最终方法,不能再被子类重载
5.final
使用对象:类、方法、字段、变量
介绍:被定义成final的类不允许出现子类,不能被覆盖(不应用于动态查询),字段值不允许被修改。
6.const
用于类成员变量的定义,一经定义,不可修改. const只能接受静态的标量
4.面向对象中接口和抽象类的区别及应用场景?
1.有抽象方法的类叫做抽象类,抽象类中不一定有抽象方法,抽象方法必须使用abstract关键字定义。
2.接口中全部是抽象方法,方法不用使用abstract定义。
3.当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口。
5.serialize() /unserialize()函数的作用是什么?
1.serialize()
这个函数作用就是序列化数据,返回一个可存储的字符串,该函数有利于存储或传递PHP的值,同时不丢失其类型和结构
2. unserialize()
这个函数作用就是反序列化数据----从已存储的表示中创建 PHP 的值
6. 什么是面向对象?主要特征是什么?
1.什么是面向对象
面向对象编程,也就是我们常说的OOP,其实是面向对象的一部分。面向对象一共有3个部分:面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP)。我们现在将要学习的就是面向对象的编程,而面向对象编程中两个首要了解的也是很重要的概念就是类和对象。
2.主要特征
(1).封装性
简单形象的解释就是,把功能放在一个盒子里,要用到这个功能的时候,打开盒子,取出就可以使用。
(2).继承性
子类自动继承一个或多个父类中的属性与方法,并可以重写或者添加新的属性或方法。
这个特性简化了类和对象的创建,提高了代码的可重用性。
(3).多态性
指的是一个类可以创建多个对象,获取不同的结果。
7.类中如何定义常量?在类中、类外分别是如何调用常量的?
1.如何定义常量
有两种定义方式:
用define()函数来定义常量
define('STATUS', 3); // 如果第三个参数设置为true,则大小写不敏感
echo STATUS;
用const关键字来定义常量
const NAME = 4;
echo NAME;
2. 在类中、类外分别是如何调用常量的?
<?php class Foo{
const con_var="常量值不能被改";
public function method_a(){
echo (self::con_var); // 内部调用
}
}
echo(Foo::con_var); //外部调用 注修饰符为
public $myFoo=new Foo();
echo ($myFoo->method_a());
?>
三、编程题
1. 请简单写一个类,实例化这个类,并写出调用该类的属性和方法的语句。
<?php
class NewClass {
public function hello(){
echo "hello world";
}
}
$newclass = new NewClass();
$newclass -> hello();
?>
2. 定义一个Person类,成员属性有:姓名、性别、年龄,成员方法有:构造方法、say()方法、run()方法、析构方法。再定义一个子类Student继承Person类,要求在子类的say()方法中完成父类方法的调用。
<?php
class Person { //声明一个人类Person,其中包含三个成员属性和两个成员方法
//下面是声明人的成员属性
var $name; //第一个成员属性$name定义人的名子
var $sex; //第二个成员属性$sex定义人的性别
var $age; //第三个成员属性$age定义人的年龄
//声明一个构造方法,将来创建对象时,为对象的成员属性赋予初值
function __construct($name, $sex, $age) {
$this->name = $name; //在创建对象时,使用传入的参数$name为成员属性$this->name赋初值
$this->sex = $sex; //在创建对象时,使用传入的参数$sex为成员属性$this->sex赋初值
$this->age = $age; //在创建对象时,使用传入的参数$age为成员属性$this->age赋初值
}
//下面是声明人的成员方法
function say(){ //在类中声明说话的方法,使用$this访问自已对象内部的成员属性
return "我的姓名是:".$this->name.", 性别:".$this->sex.", 我的年龄是:".$this->age."。<br>";
}
function run() { //在类中声明另一个方法
return $this->name."在走路<br>"; //使用$this访问本对象中的$name属性
}
function __destruct() {
return "再见".$this->name."<br>";
}
}
class Student extends Person{
function say1(){
return $this->say()."继承Person类";
}
}
// 下面三行通过new关键字实例化person类的三个实例对象
$person1=new Person("张三", "男", 20);
// echo $person1->run();
$student = new Student("John","male","20");
echo $student->say1();
?>
3.用面向对象来实现A类同时继承B类和C类。
<?php
interface testA{
function echostr();
}
interface testB extends testA{
function dancing($name);
}
class testC implements testB{
function echostr(){
echo "接口继承,要实现所有相关抽象方法!";
echo "<br>";
}
function dancing($name){
echo $name."正在跳舞!";
}
}
$demo=new testC();
$demo->echostr();
$demo->dancing("模特");
4.通过static关键字限制一个类最多只能创建出一个实例化对象(提示:单态设计模式)。
class Person{
//成员属性
public $name;
public $age;
public $gender;
public static $country="中国";
//构造方法
function __construct($name,$age,$gender){
$this->name = $name;
$this->age = $age;
$this->gender = $gender;
}
//成员方法
static function say(){ //----静态方法中用了非静态变量,出错
echo "Hello, everyone! 我的名字是:{$this->name},我的年龄是:{$this->age},我的性别是:{$this->gender}<br>";
echo "我的国籍是".self::$country."<br>"; //使用了本类(self表示本类)的静态属性$country,好处是 即使父类的类名变化了 这里也不用改
}
function run(){
}
static function eat(){
echo "I'm eating...Yummy!<br>";
}
//析构方法
function __destruct(){
echo "{$this->name}:再见<br>";
}
}
Person::eat();
Person::say();
5. 定义一个汽车(Car)类和一个公交车(Bus)类,要求如下。
(1)汽车(Car)类内有两个私有属性:型号(model)、颜色(color) ,成员方法包含构造方法,__toString( )方法,还有__set( ) __get( )方法。其中,__toString( )方法负责输出“这是一辆汽车,型号为XXX,颜色为XXX。”
(2)公交车(Bus)类继承汽车(Car)类,内有一个私有属性:共载人数(number),并重写父类的构造方法和__toString( )方法。其中,__toString( )方法负责输出“这是一辆公交车,型号为XXX,颜色为XXX,载客人数为XX人。”
<?php
class Car{
private $model;
private $color;
public function __construct($model,$color) {
$this->model = $model;
$this->color = $color;
}
//set
function __set($name,$value){
$this->name = $value;
}
function __get($name){
if (isset($this->$name))
{
return ($this->$name);
}
else
{
return NULL;
}
}
//自动加载
function __toString(){
return "这是一辆汽车,型号为{$this->model},颜色为{$this->color}.<br>";
}
}
class Bus extends Car{
private $number;
function __set($name,$value){
$this->number = $value;
}
function __toString(){
return "这是一辆汽车,型号为{$this->model},颜色为{$this->color}.载客人数为{$this->number}人";
}
}
$car = new Car('奔驰','白色');
echo $car;
$bus = new Bus('奔驰','白色');
$bus->number = 43;
echo $bus;
?>
6. 编写一个PHP程序,保存为Rectangle.php要求如下:
(1)创建一个矩形(Rectangle)类,该类的成员属性有:宽(width)、高(height)、颜色(color)、周长(perimeter)、面积(area),属性均使用private关键字封装在类内部;成员方法有:构造方法,求周长方法calcPerimeter(),求面积方法calcArea(),say()方法。其中,构造方法实现在创建对象的时候对宽、高、颜色进行初始化,say()方法实现打印出矩形对象的所有成员信息。
(2) 用Rectangle类创建两个实例$rec1和$rec2,分别为宽4高3红色,宽10高5蓝色,并调用这两个对象的成员方法,计算并打印出矩形对象的宽、高、颜色、周长、面积。
<?php
class Rectangle{
private $width;
private $height;
private $color;
private $perimeter; //周长
private $area; //面积
function __construct($width,$height,$color){
$this->width=$width;
$this->height=$height;
$this->color=$color;
}
function calcPerimeter(){
$perimeter = ($this->width+$this->height)*2;
return $perimeter;
}
function calcArea(){
$area = $this->width*$this->height;
return $area;
}
function say(){
echo "宽:{$this->width} | 高:{$this->height} | 颜色:{$this->color} | 周长:{$this->calcPerimeter()} | 面积:{$this->calcArea()}<br />";
}
}
$rec1 = new Rectangle(4,3,"红色");
$rec2 = new Rectangle(10,5,"蓝色");
$rec1->say();
$rec2->say();
?>
7.使用面向对象中封装、继承、多态三大特性及接口的应用,实现在同一个电脑主板的PCI插槽中,安装声卡、网卡和显示卡等符合PCI规范的不同功能的PCI设备。当插入不同的PCI设备卡时,就开启被插入卡的功能(提示:声明一个PCI接口、声卡类、网卡类、显示卡类、主板类、安装工人类,其中每个PCI设备都要实现PCI接口的规范)。
8. 请用 PHP编写一个Mysql类,实现在每次对数据库连接的访问中都只能获得唯一的一个数据库连接,写出主要逻辑代码即可。(假设数据库连接信息为Host:locahost; 数据库用户名:root, 数据库密码:123)
<?php
class Mysql
{
private static $instance = null;
private $conn;
// 构造方法,设置为private,不允许通过new获得对象实例
private function __construct(argument)
{
$conn = mysql_connect("localhost","root","123");
}
// 获取实例方法
public function getInstance()
{
if (!self::$instance instanceof self) {
self::$instance = new self;
}
return self::$instance;
}
// 禁止克隆
private function __clone(){}
}
// 获得对象
$db = Mysql::getInstance();
?>
文档下载:《高级Web后台开发》复习