1. 写出 php 的 public、protected、private 三种访问控制模式的区别。

public:公有,任何地方都可以访问
protected:继承,只能在本类或子类中访问,在其它地方不允许访问
private:私有,只能在本类中访问,在其他地方不允许访问

相关题目:请写出 PHP5 权限控制修饰符

private protected public

2. 设计模式考察:请用单态设计模式方法设计类满足如下需求:

请用 PHP5 代码编写类实现在每次对数据库连接的访问中都只能获得唯一的一个数据库连接,具体连接数据库的详细代码忽略,请写出主要逻辑代码。

<?php
class Mysql
{
private static $instance = null;
private $conn; // 构造方法,设置为private,不允许通过new获得对象实例
private function __construct(argument)
{
$conn = mysql_connect("localhost","root","root");
} // 获取实例方法
public function getInstance()
{
if (!self::$instance instanceof self) {
self::$instance = new self;
}
return self::$instance;
} // 禁止克隆
private function __clone(){}
} // 获得对象
$db = Mysql::getInstance();
?>
3. 写出下列程序的输出结果。
<?php
class a
{
protected $c; public function a()
{
$this->c = 10;
}
} class b extends a
{
public function print_data()
{
return $this->c;
}
} $b = new b();
echo $b->print_data();
?>

输出结果 10

[!]4. PHP5 中魔术方法函数有哪几个,请举例说明各自的用法。

__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 实例化一个对象时,如果对应的类不存在,则该方法被调用

相关题目:请写出 php5 的构造函数和析构函数

构造函数:__construct
析构函数:__destruct

5. 如何使用下面的类,并解释下面什么意思?
<?php
class test{
function Get_test($num){
$num = md5(md5($num)."En");
return $num;
}
} $testObject = new test();
$encryption = $testObject->Get_test("itcast");
echo $encryption;
?>

双重 md5 加密

6. How would you declare a class named “myclass” with no methods or properties?(Yahoo)

class myclass{};

相关题目:如何声明一个名为“myclass”的没有方法和属性的类?
7. How would you create an object, which is an instance of “myclass”? (Yahoo)

$obj= new myclass();

相关题目:如何实例化一个名为“myclass”的对象?
8. How do you access and set properties of a class from within the class?(Yahoo)

使用语句:$this->propertyName,例如:

<?php
class mycalss{
private $propertyName;
public function __construct()
{
$this->propertyName = "value";
}
}
?>
9. The code below ___________ because ____________.
<?php
class Foo{
?>
<?php
function bar(){
print "bar";
}
}
?>

A. will work, class definitions can be split up into multiple PHP blocks.
B. will not work, class definitions must be in a single PHP block.
C. will not work, class definitions must be in a single file but can be in multiple PHP blocks.
D. will work, class definitions can be split up into multiple files and multiple PHP blocks.
答案: B

10. 类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是____。
serialize() 和 unserialize()
11. 在 PHP 中,如果派生类与父类有相同名字的函数,则派生类的函数会替换父类的函数,程序结果为
<?php
class A{
function disName(){
echo "Picachu";
}
} class B extends A{
var $tmp;
function disName(){
echo "Doraemon";
}
} $cartoon = New B;
$cartoon->disName();
?>

A. tmp
B. Picachu
C. disName
D. Doraemon
E. 无输出
答案:D

12. 接口和抽象类的区别是什么?

抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract 来声明的。
抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。
抽象方法的格式为:abstract function abstractMethod();

接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。
抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。
子类继承抽象类使用 extends,子类实现接口使用 implements。

13. 类中如何定义常量、如何类中调用常量、如何在类外调用常量。

类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。定义常量使用关键字 const,例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,访问常量的格式都是类名加作用域操作符号(双冒号)来调用,即:类名:: 类常量名

14. autoload()函数是如何运作的?

使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。
当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。

这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行 include 或者 require 来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

15. 哪种OOP设置模式能让类在整个脚本里只实例化一次?

A. MVC
B. 代理模式
C. 状态模式
D. 抽象工厂模式
E. 单件模式
答案:E

16. 借助继承,我们可以创建其他类的派生类。在PHP中,子类最多可以继承几个父类?

A. 1个
B. 2个
C. 取决于系统资源
D. 3个
E. 想要几个有几个
答案:A

17. 执行以下代码,输出结果是
<?php
abstract class a{
function __construct()
{
echo "a";
}
} $a = new a();
?>

A. a
B. 一个错误警告
C. 一个致命性的报错
答案:C 因为类a是抽象类,不能被实例化

18. 执行以下代码,输出结果是
<?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 a something
D. echo class b something
答案:D
类 b 继承自类 a,两个类都定义了构造函数,由于二者名字相同,所以子类中的构造函数覆盖了父类的构造函数,要想子类对象实例化时也执行父类的构造函数,需要在子类构造函数中使用 parent::__construct()来显示调用父类构造函数。

19. 请定义一个名为MyClass的类,这个类只有一个静态方法justDoIt。
<?php
class MyClass{
public static function justDoIt(){ }
}
?>
20. 只有该类才能访问该类的私有变量吗?(卓望)

是的

21. 写出你知道的几种设计模式,并用php代码实现其中一种。

单例模式,工厂模式,策略模式等。
单例模式 实现代码 见 第二题。

转自:钛21网 » PHP面试题及答案解析(2)—PHP面向对象

PHP面试题及答案解析(2)—PHP面向对象的更多相关文章

  1. PHP面试题及答案解析(8)—PHP综合应用题

    1.写出下列服务的用途和默认端口. ftp.ssh.http.telnet.https ftp:File Transfer Protocol,文件传输协议,是应用层的协议,它基于传输层,为用户服务,它 ...

  2. PHP面试题及答案解析(7)—Linux系统命令

    1.请解释下列10个shell命令的用途.top.ps.mv.find.df.cat.chmod.chgrp.grep.wc top:该命令提供了实时对系统处理器状态的监控,它能够实时显示系统中各个进 ...

  3. PHP面试题及答案解析(5)—数据结构与算法

    1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口) <?php class Test implements ...

  4. PHP面试题及答案解析(6)—PHP网络编程

    1.禁用COOKIE后SEESION还能用吗? 可以,COOKIE和SESSION都是用来实现会话机制的,由于http协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的状态,需要有这么一个 ...

  5. PHP面试题及答案解析(4)—PHP核心技术

    1.写出一个能创建多级目录的PHP函数. <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $mode int 创建目录的模式,在 ...

  6. PHP面试题及答案解析(3)—MySQL数据库

    1.mysql_num_rows()和mysql_affected_rows()的区别. mysql_num_rows()和mysql_affected_rows(),这两个函数都作用于 mysql_ ...

  7. PHP面试题及答案解析(1)—PHP语法基础

    1. strlen( )与 mb_strlen( )的作用分别是什么? strlen和mb_strlen都是用于获取字符串长度.strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数.如 ...

  8. 2020年大厂Java面试前复习的正确姿势(800+面试题附答案解析)

    前言 个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事.所以,劝各位不要因为面试失败而灰心. 丧失斗志.也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油! 本篇分享的面试题内容 ...

  9. PHP面试题2019年阿里巴巴面试题及答案解析

    一.单选题(共27题,每题5分) 1.Memcache与Redis的比较错误的是? A.Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据: B.Mem ...

随机推荐

  1. 如何将django部署从顶级目录迁移到子目录下(NGINX UWSGI DJANGO)

    因为公司网站合并,要将我们的DJANGO项目从IP的顶级目录迁移到域名的二级目录. 以前硬编码的URL可惨了. 还涉及到upload目录,静态目录,websocket目录. 全用{% url %}问题 ...

  2. (10)ERStudio

     1.外键 https://jingyan.baidu.com/article/f79b7cb37e9d219144023ea6.html 第一个图标:Identifying Relationship ...

  3. #424 Div2 C

    #424 Div2 C 题意 给出 k 个分数,初始分数未知,按顺序把这 k 个分数加到初始分数上,已知 n 个加入分数后的结果(无序),问初始分数有多少种可能. 分析 也就是说这 n 个结果,它们之 ...

  4. Oracle PL/SQL入门之慨述

    Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...

  5. Windows 8.1中WinRT的变化(二)——新增功能

    首先我们来看看现有控件中新增的功能: FlipView编程方式切换时支持平滑滚动: 在Windows8中,FlipView在用手触控翻页的时候是有动画效果的,但当我们使用键盘或代码编程翻页时,却没有这 ...

  6. Visual Studio 行末回车时运算符两侧自动加空格是怎么设置的

    在工具—>选项->文本编辑器->c#->格式设置->间距后有三个选项 如果已经选中"二元运算符前后插入空格" 而VS又抽风没有这个功能时,可以选中其余 ...

  7. MySQL不能启动 Can't start server : Bind on unix socket: Permission denied

    转载博客地址:http://www.linuxidc.com/Linux/2010-04/25709.htm MySQL服务器突然不能启动,查看最后的启动日志如下: 080825 09:38:04 m ...

  8. vi中使用“/”查找字符

    在vi 文件中使用"/"查找字符串 命令模式下,输入 /word 后回车,即查找word,按 n 查找下一个匹配单词,按 N 查找上一个匹配单词.

  9. Python - 连续替换(replace)的正則表達式(re)

    字符串连续替换, 能够连续使用replace, 也能够使用正則表達式. 正則表達式, 通过字典的样式, key为待替换, value为替换成, 进行一次替换就可以. 代码 # -*- coding: ...

  10. 【HTML 元素】嵌入图像

    img元素允许我们在HTML文档里嵌入图像. 要嵌入一张图像需要使用src和alt属性,代码如下: <img src="../img/example/img-map.jpg" ...