php设计模式面试题,php设计模式介绍之迭代器模式
php设计模式面试题,php设计模式介绍之迭代器模式详细介绍
本文目录一览: PHP 面试问哪些问题可以比较准确的反映出应聘者的开发水平
问问这些:
命名空间怎么用,有什么好处
PHP下面如果过滤表单的内容,有哪些HTML的过滤库比较好用?
PDO、mysqli、mysql这三种操作数据库的方法,具体有哪些差异?
问问javascript/jquery,不懂javascript得php程序员要么没有什么经验,要么水平比较低。
再问问php的设计模式,这个是有没有接受过系统训练的基础了。
第一个问题答得好,证明有了解过现代php的开发,用什么框架应该都能快速上手。
第二、三个问题,都是开发中必定用到的基础的东西,算考查究竟懂不懂php。
第四个问题,关系到有没有问题解决能力,不懂javascript的php程序员肯定和前端搭配不好。
第五个问题,看看这个人有没有潜力呗。
11月1日补充:
中间某个问题得罪人了,先抱歉一下。我认为我太武断的说法也有道理,反正,这只是经验之谈,从上方老板的角度出发,肯定是没心思招个干不了活的人慢慢培养的,哪怕你宏观及看法方面很有远见。团队里面肯定要有各种各样的人和技能盏,看你的头儿如何建团队了。
如何面试 PHP 工程师
问一些日常的正常的PHP问题,主要是考察应聘者的认知:
一个包含中英文的字符串如何获得它的自然长度(看看ta是否有encoding的知识和意识)
问一问什么是ORM,有时候会问这个词的英文全称是什么,问问ta对于ORM有什么个人的看法?(看看ta学习细不细,有没有技术判断,PHP开发人员应该知道什么时候使用ORM)
问一问假如ta要自己去实现一个framework,ta会怎么设计。(看看ta对代码架构的理解,对MVC的理解)
问一问framework设计里的url dispatcher他会怎么考虑。(HTTP知识)
问一问ta对框架本身的看法
了解一下ta对Design Pattern的认知,比如Singleton,Observer,Factory等常用的设计模式,问一问ta对设计模式本身的看法。
问两三个数据库设计的问题
问几个前端的问题,哪怕ta的职位是PHP开发人员,好的PHP人员不可能不了解前端,而且很可能很了解前端
问一问ta对noSQL的了解情况(对与noSQL的认识是和传统Relational DB的认知是分不开的)
问一问ta碰到问题时候会如何去寻找答案
问一问ta习惯使用哪一个搜索引擎(如果是http://GOOGLE.COM就有加分)
问一问ta最近看的书
问一问ta的职业规划,喜欢做什么,对工作环境有什么要求
别出生僻的题,别为难人家,更不要变相的侮辱人家,正常交流为主,你要的是一个正常的人,优秀不优秀就看你的眼光和运气了。
很多公司的技术人员招聘会刻意追求刺激的问题,比如很著名的微软的“下水道的盖子为什么是圆的”,不是说这些考察毫无道理,但更多的是一种“marketing”的手段。
你好,面试PHP工程师时,只需要带上自己的项目就可以了.
然后对面试官说明自己做项目时的一些经验和心得体会.
如果实在没有项目的话,就把自己的一些编程经历说给面试官吧.
最后祝你面试成功.
php设计模式介绍之迭代器模式
《PHP设计模式介绍》第八章 迭代器模式
类中的面向对象编程封装应用逻辑 类 就是实例化的对象 每个单独的对象都有一个特定的身份和状态 单独的对象是一种组织代码的有用方法 但通常你会处理一组对象或者集合
属性来自 SQL 查询的一组数据就是一个集合 就像本书前面章节介绍的 Monopoly 游戏示例的对象列表
集合不一定是均一的 图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu Slider 和 Button 并且 集合的实现可以有多种方式 PHP 数字是一个集合 但也是一个散列表 一个链接列表 一个堆栈以及队列
问题
如何操纵任意的对象集合?
解决方案
使用迭代器模式来提供对集合内容的统一存取
你可能没有意识到这一点 但你每天都在使用迭代器模式 - 它潜藏在 PHP 的数组类型和各种数组操作函数中 (其实 给你一些固有类的数组的组合和一群用这些固有类工作的可变函数 你将不得不使用这些数组来处理对象集合 这是在 PHP 中的本地数组迭代
$test = array( one o three );$output = ; reset($test); do {$output = current($test);} while (next($test));echo $output; // produces oneothree
reset() 函数将迭代重新转到数组的开始 current() 返回当前元素的值 next() 则前进至数组中的下一个元素并返回新的 current() 值 当你超出数组的最后一个元素时 next() 返回 false 使用这些迭代方法 PHP 数组的内部实现就与你不相关了 迭代器结合了封装和多态的面向对象程序设计原理 使用迭代器 你可以对集合中的对象进行操作 而无需专门了解集合如何显现或者集合包含什么(对象的种类) 迭代器提供了不同固定迭代实现的统一接口 它完全包含了如何操纵特定集合的详细信息 包括显示哪些项(过滤)及其显示顺序(排序)
让我们创建一个简单的对象 在数组中对它进行操作 (尽管该示例在 PHP 环境下 但迭代器并不特定于 PHP 虽然添加了较多的引用操作符 本章节中的大多数示例在 PHP 下也能够运行) 对象 Lendable 表示诸如电影 相册等媒体 它作为 Web 站点的一部分或服务 允许用户浏览或将他们的媒体集合分享给其他用户 (对 于该示例 请无需考虑其他方面 )让我们开始下面对 Lendable 基础设计的测试
// PHP class LendableTestCase extends UnitTestCase {function TestCheckout() {$item = new Lendable;$this >assertFalse($item >borrower);$item >checkout( John );$this >assertEqual( borrowed $item >status);$this >assertEqual( John $item >borrower);}function TestCheckin() {$item = new Lendable;$item >checkout( John );$item >checkin();$this >assertEqual( library $item >status);$this >assertFalse($item >borrower);}}
要实现这一最初测试的需求 我们来创建一个带有若干公共属性和一些方法的类 来触发这些属性的值
class Lendable {public $status = library ;public $borrower = ;public function checkout($borrower) {$this >status = borrowed ;$this >borrower = $borrower;}public function checkin() {$this >status = library ;$this >borrower = ;}}
Lendable 是一个好的 普通的开端 让我们将它扩展到诸如 DVD 或 CD 的磁道项 媒体扩展了 Lendable 并且磁道详细记录了特定媒体的详细信息 包括项目的名称 发布的年份以及项本身的类型
class Media extends Lendable {public $name; public $type; public $year;public function __construct($name $year $type= dvd ) {$this >name = $name;$this >type = $type;$this >year = (int)$year;}}
要使事情更加简单 媒体有三个公共的实例变量 Media::name Media::year 和Media::type 构造函数采用了两个参数 将第一个存储在 $name 中 第二个存储在 $year 中 构造函数还允许可选的第三个参数来指定类型(缺省为dvd)
给定单独的对象来操作 你现在可以创建一个容器来包含他们 Library 类似于常用的库 Library 应该能够添加 删除和计算集合中的项 甚至 Library 还应该允许访问集合(本章中的样本代码部分可看到示例)中的单一的项(对象)
我们开始构建 Library 的测试用例
class LibraryTestCase extends UnitTestCase {function TestCount() {$lib = new Library;$this >assertEqual( $lib >count());}}
它是满足这一测试的简单类
class Library {function count() {return ;}}
继续将一些有趣的功能添加到测试中
class LibraryTestCase extends UnitTestCase {function TestCount() { /* */ }function TestAdd() {$lib = new Library;$lib >add( one );$this >assertEqual( $lib >count());}}
实现 add() 的简单方法是建立在 PHP 灵活数组函数的基础上 你可以将项添加到实例变量并使用 count() 来返回集合众项的数量
class Library {protected $collection = array();function count() {return count($this >collection);}function add($item) {$this >collection[] = $item;}}
lishixinzhi/Article/program/net/201311/13092
php设计模式有哪几种
php设计模式有以下几种模式:1、命令链模式,命令链模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。2、策略模式,在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。3、工厂模式,是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。4、单元素模式,可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。5、观察者模式,一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。
PHP的单态设计模式
给你个代码看下吧。更直观一些
<!--?phpclass db
{
private static $instance=false;
public static function instance($host,$name,$pass,$dbname)
{
if(self::$instance===false)
{
self::$instance=new db(......);
}
return self::$instance;
} private function __construct()
{
/*这个函数必须是私有的,它保证了只能通过单例生成器来获得实例*/
} public function __clone()
{
/*什么也不做*/
}
}
?> 外部调用的时候,调用那个instance函数 ,以保证他的唯一性
对于java转过来程序员说是单态设计模式,在PHP上通常说是单例模式,说法不一样,手册上也有介绍:
单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
<!--?phpclass Example
{
// 保存类实例在此属性中
private static $instance;
// 构造方法声明为private,防止直接创建对象
private function __construct()
{
echo 'I am constructed';
}
// singleton 方法
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Example类中的普通方法
public function bark()
{
echo 'Woof!';
}
// 阻止用户复制对象实例
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
?>
这样我们可以得到一个独一无二的Example类的对象。
<!--?php// 这个写法会出错,因为构造方法被声明为private
$test = new Example;
// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->bark();
// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;
?>
php设计模式之单例、多例设计模式的应用分析
本篇文章是对php设计模式中的单例与多例设计模式的应用进行了详细的分析介绍 需要的朋友参考下 单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量 如模式名称 单例只能实例化一次 只有一个对象 多例模式可以多次实例化 基于Singleton的特性 我们经常用Singleton配置应用程序并定义应用程序中可能随时访问的变量 但有时并不推荐使用Singleton 因为它生成了一个全局状态且 该单一根对象没有封装任何系统功能 多数情况下 会使单元测试和调试变得困难 读者根据情况自行决定 代码示例
复制代码 代码如下:
Multiton与singleton相似 不同的是后者需要getInstance()函数传递关键值 对于给定的关键值只会存在唯一的对象实例 如果有多个节点 每个节点拥有唯一的表识符 且各个节点在某单次执行(如cms里的节点)可能出现多次 那么就可以用Multiton模式实现这些节点啊 Multiton节省内存 并确保同一个对象的多个实例不发生冲突 示例
复制代码 代码如下: lishixinzhi/Article/program/PHP/201311/21166
什么时候使用PHP设计模式和为什么要使用
进入php源程序目录中的ext目录中,这里存放着各个扩展模块的源代码,选择你需要的模块,比如curl模块:cd curl
执行phpize生成编译文件,phpize在PHP安装目录的bin目录下
/usr/local/php5/bin/phpize
运行时,可能会报错:Cannot find autoconf. Please check your autoconfand
the $PHP_AUTOCONF
environment variable is set correctly and then rerun this
script.,需要安装autoconf:
yum install autoconf(RedHat或者CentOS)、apt-get install
autoconf(Ubuntu Linux)
/usr/local/php5/bin/php -v
执行这个命令时,php会去检查配置文件是否正确,如果有配置错误,这里会报错,可以根据错误信息去排查!
急求6道PHP笔试题答案
1.自己写的仅供参考
<!--?php function intNumber($num)
{
if(is_int($num))
{
$r_num = trim(strrev($num),"0");
$nums = $num."->".$r_num;
}
return $nums;
}
echo intNumber(9200);
echo intNumber(9020);
echo intNumber(321);
?>
我也是做JAVA的,现在做PHP呢,面试题JAVA的没事。面试题啊如果出PHP的我干脆就不答。
2:我觉得第二题比较有意思,如果不缓存,用递归100就已经够大了
<!--?php$cache_ary = array(0=>1 , 1=>1);
$num = 1200;
function fib_cache($i){
global $cache_ary;
if($i == 1 || $i == 0 ){
return $cache_ary[$i];
}else if(isset($cache_ary[$i])){
return $cache_ary[$i];
}else{
$cache_ary[$i] = fib_cache($i - 1) + fib_cache($i - 2);
return $cache_ary[$i];
}
}
function fib_2($i){
if($i == 0 || $i == 1){
return 1;
}else{
return fib_2($i - 1) + fib_2($i - 2);
}
}
?>
新手入门php要学哪些内容呢?
1、WEB基础
要知道网站是什么东西,所使用的协议是怎么工作的,怎样把网站放在服务器上。
2、HTMLphp
HTMLphp是嵌入在HTML的语言,所以HTML是必须的。可以用HTML写出简单的静态的页面,放在本机的服务器上看看效果。
3、DIV+CSS
能够用DIV+CSS布局做出漂亮的精美静态网页。
4、php基础
学习php基础,如php语法,php变量,php流程控制,php函数,php数组应用,php字符串处理,php常用模块,php文件处理,php动态图像处理,会话控制等,就可以把静态页面变成动态的。这个阶段比较枯燥,主要是记忆,必须能够熟练应用。
5、MySQL
网站往往包含大量的信息,这些信息不可能都放在程序(php文件)中,需要MySQL来储存大量的数据信息。
6、Javascript
掌握了以上内容就可以搭建一个php基础网站,但是还需要靠Javascript来完成网站的特效和信息验证等。
7、php高级
作为一个可以上线运营的全功能网站,还要继续学习php高级知识,如php面向对象,数据抽象层PDO,MEMCACHE,高级SESSION,php的设计模式,MVC,smarty模板,主流框架的解读等内容,这个阶段需要多读优质的开源代码,多写代码。
8、Linux
正如大家所熟知的php较佳的搭配是LAMP(Linux+Apache+MySQL+Php)或LNMP(Linux+Nginx+MySQL+Php),那么显然在Linux系统下的php网站比在Windows下兼容性好,基于此我们需要知道在Linux下搭建php环境的方法以及Linux的日常管理命令,以便我们网站的日常管理运营。
9、项目相关
这个阶段首先需要了解项目开发流程,需求分析,程序设计说明书,数据库设计说明书,编码规范,大流量/大数据架构,MYSQL深度优化,全文索引等内容。
目前为止学到这个阶段,已经可以算是php小牛了,要继续向php大牛进发就需要参与开发大型网站项目,以此练手。北大青鸟认为参与大项目开发,实践为主。通过这阶段的学习就可以自主做企业网站、论坛、网页游戏等。