PHP

雇佣 排名前3% of 自由PHP开发人员

PT视讯是顶级PHP开发人员的市场, 工程师, 程序员, 程序员, 架构师, 和顾问. 顶级的公司和初创企业选择PT视讯 PHP开发服务来进行关键任务的PHP web开发项目.

无风险试验,满意才付款.

客户的速度 PT视讯 PHP开发人员4.3 / 5.0截至2021年12月21日,在2012次评论中,平均而言

被领先品牌和初创公司所信赖

雇佣自由PHP开发人员和工程师

杰伊·约翰斯顿

自由的PHP开发人员

美国2013年11月6日起在PT视讯担任PHP开发人员

编码的HTML, CSS, 和JS在1997年的武装部队时期, Jay在调整网络技术以满足客户需求方面有着丰富的经验. 他喜欢通过电子商务解决方案为客户带来价值, 遗留集成, 并优化了PHP和javascript驱动的应用程序.

显示更多

Arianit Fazliu

自由的PHP开发人员

科索沃2014年8月25日起在PT视讯担任PHP自由开发人员

Arianit是一个熟练的前端和后端开发人员,拥有超过9年的专业经验. 他对Vue有很强的了解.js, 反应, AngluarJS, PHP Laravel, 节点.js、WordPress、Photoshop、Illustrator、HTML5/CSS3、JavaScript.

显示更多

伊戈尔·桑托斯

自由的PHP开发人员

巴西2013年10月20日起在PT视讯担任PHP自由开发人员

Igor是一个专注于现代PHP和JS的网页开发者,一直在努力追求新技术. 当他戴上后端帽子时, 他专注于性能和DRY代码, 在API服务器或消费者上工作. 当他戴上前檐帽时, 他致力于为用户提供最好的用户体验.

显示更多

大卫·马林

自由的PHP开发人员

西班牙2015年4月21日起在PT视讯担任PHP开发员

David是一个开源和开放数据爱好者,拥有超过20年的专业开发经验. 他掌握了各种各样的技能, 包括网页编程(PHP和JavaScript), C, c++ (Linux和窗户下), 和系统管理. 这些技能, David specializes in web programming 和 has full-stack experience with Symfony PHP-based back ends, jQuery前端, 和WordPress-based网站.

显示更多

Alexey Filatov

自由的PHP开发人员

俄罗斯2015年2月8日起在PT视讯担任PHP自由开发人员

Alexey is an experienced full-stack developer with extensive knowledge of OOP 和 design patterns. 他专门使用节点这样的现代技术堆栈来创建复杂的web服务.js和PHP / Laravel. 他拥有超过9年的工作经验,并拥有计算机科学学士学位,以及Zend和Oracle的PHP和MySQL认证, 分别.

显示更多

伊云约万诺维奇

自由的PHP开发人员

挪威2016年4月4日起在PT视讯担任PHP自由开发人员

Branislav是一名技能高超、充满热情的开发者. 他是勤劳的, 拥有广泛的问题解决能力, 并且喜欢实现一个通用的算法方法. 有团队合作精神,积极进取, Branislav对电子商务和PHP感兴趣,希望进一步与其他服务建立联系. 他参与了从识别客户的真正需求到设计系统架构以及实现的整个开发生命周期.

显示更多

米罗瓦瑞尔

自由的PHP开发人员

塞尔维亚自2014年9月22日起在PT视讯担任PHP自由开发人员

Milorad在微软的IT项目上有超过十年的经验, 思科, 虚拟机系统, 网络, 网络电话, 和其他技术. 他是非常自我激励和专业的QA领导者,总是愿意将改进引入工作流程. 他具有很强的团队合作精神,能够给予其他员工支持和指导. Milorad在各种环境中都能很好地工作.

显示更多

亚历克斯·冈萨雷斯

自由的PHP开发人员

美国自2019年2月25日起成为PT视讯的自由PHP开发人员

Alex拥有超过十年的软件开发经验,尤其是web和移动应用程序. 他曾为包括AT在内的公司领导互动项目的开发&T, EMC, 传奇影业, 惠普, Foundation Capital, 加州大学洛杉矶分校, 阿纳海姆鸭子, 和LA18电视. 他开发的应用程序曾出现在TechCrunch和iPod广告中. Alex graduated with a degree in Applied Ma的matics from 的 University of California, Berkeley.

显示更多

泰勒史坦利

自由的PHP开发人员

美国2018年6月25日起成为PT视讯的自由PHP开发人员

以及良好的沟通技巧和良好的职业道德, Tyler带来了他的实践经验与广泛的编程语言. 但最近,他的重点转向了JavaScript库. 在他的整个职业生涯, 他曾作为核心开发者在多个敏捷团队中工作过,现在他对任何与javascript相关的工作都感兴趣.

显示更多

本杰明kuk

自由的PHP开发人员

加拿大自2019年10月15日起在PT视讯担任自由PHP开发人员

Benjamin是一名优秀的开发人员,他的职业生涯亮点是在一家大数据分析初创公司担任高级全栈开发人员, 付款处理器, 以及用户测试服务. 他的工作横跨整个开发生命周期,并专攻前端. Benjamin对实现细节一丝不苟,同时总是考虑和平衡更广泛的涉众关注. 在沟通方面,他是敏捷的、相关的、专业的.

显示更多

罗兰Csatlos

自由的PHP开发人员

罗马尼亚自2017年5月29日起在PT视讯担任自由PHP开发人员

拥有超过10年的编程经验和6年以上的企业主经验, 罗兰知道与客户进行良好沟通和理解的重要性. 他痴迷于高质量和对细节的关注, 他努力寻找可能的最佳解决方案. 他目前专注于在他的项目中使用Magento或TYPO3.

显示更多

现在就注册看看更多的资料.

开始招聘

招聘指南

雇佣优秀PHP开发人员指南

虽然许多人可以合法地声称“了解”PHP, 那些真正精通这门语言的人能够生产出可扩展得多的软件, 功能, 健壮的, 和可维护的. 本指南提供了一些有效的问题样本,以帮助评估候选人对PHP掌握的广度和深度.

阅读招聘指南

PHP招聘资源

Trustpilot
媒体报道

... allows corporations to quickly assemble teams that have 的 right skills for specific projects.

Despite accelerating dem和 for 程序员, PT视讯 prides it自我 在一个lmost Ivy League-level vetting.

我们的客户
创建一个跨平台应用,供全世界使用
蒂埃里Jakicevic
创建一个跨平台应用,供全世界使用
观看视频
123
奖状

如果没有PT视讯, Tripcents就不会存在. PT视讯 Projects让我们的基金会在产品经理的帮助下快速发展, 带领开发人员, 和高级设计师. 在60多天的时间里,我们从概念到Alpha. 它的速度、知识、专业技能和灵活性是首屈一指的. PT视讯团队和其他内部团队成员一样,都是tripcents的一部分. 他们和其他人一样为开发做出了贡献并获得了所有权. 我们将继续使用PT视讯. 作为一个创业公司,它们是我们的秘密武器.

首席执行官Brantley步伐 & 联合创始人

Tripcents

我对PT视讯的经验非常满意. 和我一起工作的专业人士在几个小时内就和我通了电话. 在和他讨论了我的项目后,我知道他是我想要的候选人. 我立刻雇佣了他,他也立刻参与了我的项目, even going 的 extra mile by adding some great design elements that enhanced our overall look.

导演保罗•Fenley

K邓恩 & 的同事

与我搭档的开发人员都非常出色——聪明、有动力、反应灵敏. 过去很难找到高质量的工程师和顾问. 现在不是.

瑞安·洛克菲勒,首席执行官

Radeeus

PT视讯立即理解了我们的项目需要. 我们请来了一位来自阿根廷的优秀自由职业者, 从第一天起, 投身于我们的行业, 与我们的团队完美融合, 理解我们的愿景, 并产生了一流的结果. PT视讯使得与高级开发人员和程序员的联系非常容易.

Jason Kulik创始人之一

ProHatch

作为一家资源有限的小公司,我们不能犯代价高昂的错误. PT视讯为我们提供了一个经验丰富的程序员,他能够立即投入工作并开始贡献. 这是一个伟大的经历,我们会在心跳中再次重复.

斯图尔特·柏克尼校长

站点专用软件解决方案

我们通过PT视讯聘请了一位拥有丰富亚马逊网络服务经验的开发人员. We interviewed four c和idates, one of which turned out to be a great fit for our requirements. 这一过程迅速而有效.

Abner Guzmán Rivera,首席技术官和首席科学家

照片Kharma

Sergio是一个非常棒的开发者. 一流,反应灵敏,工作效率高.

Dennis Baldwin,首席技术专家和联合创始人

PriceBlink

和Marcin一起工作是一种乐趣. 他是主管, 专业, 灵活的, 并且非常快地理解需要什么以及如何实现它.

Andre Fischer首席技术官

POSTIFY

我们需要一位专业的工程师,他能立即开始我们的项目. Simanas的工作超出了我们的预期. 不需要面试和寻找专业的开发人员是一个非常好的时间节省,并使每个人对我们选择转换平台以使用更健壮的语言感到更舒服. PT视讯让这个过程变得简单和方便. PT视讯现在是我们寻求专家水平帮助的第一个地方.

Derek Minor,网络开发高级副总裁

Networld传媒集团

PT视讯的开发人员和架构师都非常专业,也很容易共事. 他们所提供的解决方案价格合理且质量上乘,从而缩短了我们的发行时间. 再次感谢,PT视讯.

首席执行官杰里米鞋号

Kognosi

PT视讯给我们带来了很棒的体验. 的y paired us with 的 perfect developer for our 应用程序 和 made 的 process very easy. 它也很容易超出最初的时间框架, 我们能够在整个项目中保持同一个承包商. 我们强烈推荐PT视讯快速无缝地寻找高质量人才.

瑞安莫首席技术官

应用商业技术有限公司

PT视讯给我留下了深刻印象. 我们的开发人员每天都和我交流,他是一个非常强大的程序员. 他是一个真正的专业人士,他的作品非常出色. PT视讯 5星.

首席执行官皮特Casoar

Ronin Play Pty Ltd

与PT视讯合作是一次很棒的经历. 使用它们之前, I had spent quite some time interviewing o的r freelancers 和 wasn't finding what I needed. After engaging with PT视讯, 的y matched me up with 的 perfect developer in a matter of days. 与我一起工作的开发人员不仅交付高质量的代码, 但他也会对一些我没有想到的事情提出建议. 我很清楚阿莫里知道他在做什么. 强烈推荐!

首席执行官乔治•程

Bulavard公司.

作为一名合格的PT视讯前端开发人员,我还经营着自己的咨询业务. 当客户来找我帮忙填补他们团队中的关键角色时, PT视讯是我唯一放心推荐的地方. 托普塔尔的所有候选人都是精英中的精英. PT视讯 is 的 best 价值 for money I've found in nearly half a decade of 专业 online work.

伊桑•布鲁克斯首席技术官

Langlotz专利 & 商标工作的公司.

在讨价还价早期, 我们需要一流的开发人员, 以可承受的利率, 及时地. PT视讯交付!

首席执行官劳拉Aldag

讨价还价

PT视讯让你非常容易找到一个候选人,并让你放心,他们有能力提供. I would definitely recommend 的ir services to anyone looking for highly-skilled developers.

Michael Gluckman,数据经理

Mxit公司——

PT视讯能够迅速将我们的项目与最优秀的开发人员匹配起来. 开发人员已经成为我们团队的一部分, 我对他们每个人所表现出的敬业程度感到惊讶. 对于那些希望与最好的工程师远程工作的人来说,PT视讯是最好的选择.

创始人Laurent爱丽丝

Livepress

PT视讯让找到合格的工程师变得轻而易举. 我们需要一个有经验的ASP.NET MVC架构师来指导我们的初创应用程序的开发, PT视讯在不到一周的时间里就有了三个很好的候选人. 在我们做出选择后,工程师立即上线并开始工作. 这比我们自己发现和审查候选人要快得多,也容易得多.

联合创始人杰夫•凯利

协同解决方案

We needed some short-term work in Scala, PT视讯 found us a great developer within 24 hours. 这是任何其他平台都不可能实现的.

弗兰科斯巴达,创始人之一

WhatAdsWork.com

PT视讯 offers a no-compromise solution to businesses undergoing rapid development 和 scale. 我们通过PT视讯聘请的每一位工程师都迅速融入了我们的团队,在保持卓越开发速度的同时,他们的工作达到了最高的质量标准.

联合创始人格雷格•金博

nifti.com

如何通过PT视讯招聘PHP开发人员

1

与我们的行业专家之一谈谈

PT视讯的工程总监将与您一起工作,以了解您的目标, 技术需求, 和团队动力.
2

与精心挑选的人才一起工作

几天之内,我们将为您的项目介绍合适的PHP开发人员. 平均匹配时间在24小时以下.
3

合身,保证

试用一段时间与新的PHP开发人员一起工作(如果满意就付费), 在订婚前确保他们是合适的人选.

常见问题

  • PT视讯 PHP开发者有何不同?

    在PT视讯, 我们彻底筛选我们的PHP开发人员,以确保我们只匹配您的人才的最高水平. 超过100个,每年有1万多人申请加入PT视讯网络, 只有不到3%的人能成功. 你将与工程专家(而不是一般化的招聘人员或人力资源代表)一起工作来理解你的目标, 技术需求, 和团队动力. 的 end result: expert vetted talent from our network, custom matched to fit your business needs. 现在就开始.

  • 我可以通过PT视讯在48小时内雇佣PHP开发人员吗?

    这取决于可用性和进度的快慢, 你可以在注册后的48小时内开始与PHP开发人员一起工作. 现在就开始.

  • PT视讯 PHP开发者的无风险试用期是什么时候?

    我们确保您和您的PHP开发人员之间的每次接触都有一个长达两周的试用期. 这意味着您有时间确认订婚是否成功. 如果你对结果完全满意的话, 我们将按时间向你收费,你们的婚约想继续多久就继续多久. 如果你不完全满意,你不会被收费. 从那里, 我们有两种选择, 或者我们可以为您提供另一位可能更适合的专家,我们将与他开始第二个, 无风险试用. 现在就开始.

分享
PHP

如何雇佣优秀的PHP开发人员

Ubiquitous…that is definitely one word you could 使用 to describe PHP in relation to 的 web. In web 应用程序s, website development, 应用程序 development - it really is everywhere. 在服务器端编程语言方面,它是迄今为止使用最广泛的, 目前超过80%的网站都在使用 (第二名是ASP.NET,远远落后,仅为17%).

为什么? 是什么让PHP如此流行和广泛使用? 这个问题没有单一的答案, PHP的易用性当然是一个重要的贡献因素. PHP新手只需具备最低限度的编程专业知识,就可以获得最新的速度,并在他们的网站中构建基于PHP的动态内容.

但是,找到高技能的PHP web开发人员面临着很大的挑战. PHP相对较低的入门门槛和20年的历史意味着PHP程序员实际上已经像该技术本身一样无处不在. 然而,尽管许多人可以合法地声称“了解”PHP, 那些真正精通这门语言的人能够生产出可扩展得多的软件, 功能, 健壮的, 和可维护的.

那么,如何区分哪些人真正擅长PHP编程,哪些人只是略知一二呢, 更不用说前1%的候选人了?

朝着这个目标, 本指南提供了一些有效的问题样本,以帮助评估候选人对PHP掌握的广度和深度. It is important to bear in mind, though, that 的se sample questions are intended merely as a guide. 并不是每一位值得雇佣的“A”候选人都能正确回答所有问题, 也不能保证回答所有这些问题就能得到一个“A”候选人. 归根结底,招聘既是一门科学,也是一门艺术 寻找少数精英).

请注意,我们已经尝试将本指南的重点放在现代PHP上.e.版本5.3,), 但其中有一些概念和函数的引用,这些概念和函数已经存在了很长时间,任何有资格和经验的PHP开发人员都应该熟悉它们.

关键的PHP概念和范例

对于兼职或全职的PHP专家来说,有许多关键的概念和范例是必须精通的. 下面是一些例子.

Q:描述一个PHP闭包. 请举例说明何时、为什么以及如何使用它们.

闭包 当需要在一个有限的范围内执行某些逻辑,但保留与该范围外的环境交互的能力时,就非常有用了. 闭包的第一个构建块是匿名的, 或λ风格, 没有关联名称的函数. 例如:

array_walk的第二个参数是一个匿名函数
array_walk($数组,函数(狗){
    echo $狗->bark();
}); 

虽然他们自己的名字与他们没有联系, 匿名函数可以赋值给变量,也可以作为回调函数传递 高阶函数 要求他们. 例如:

#定义一个匿名函数并将其赋值给一个变量
#名为$ dogs_bark.
dogs_bark美元 = 函数($dog) {  
    echo $狗->bark();
};
array_walk(数组,dogs_bark美元);

在PHP的底层,匿名函数是使用 关闭 class.

匿名函数的内容存在于它们自己的作用域中, 独立于它们被创建的范围. 然而, 对象可以显式地将外部作用域中的一个或多个变量绑定为匿名函数内的可引用变量 使用 子句. 让我们举例说明:

狗类{
    公共函数bark() { echo 'woof'; }
}

dogs_bark美元 = 函数($dog)使用(&美元的领){#通过引用绑定
    if (美元的领 == 'fitsWell'){
         echo $狗->bark(); # 'woof'
    其他}{
         echo 'no bark';    # collar is too tight to bark
    }
};

$dog = new dog;

美元的领 = 'fitsWell'; # external 变量
dogs_bark美元($dog); # 'woof'

领美元=“紧”;
dogs_bark美元($dog); # 'no bark'

这种在闭包中访问这些外部变量的能力在使用高阶函数时特别有用. 以我们的 array_walk 上面的用法, 像其他这种类型的函数一样, 以非常特定的方式对所传递的主题变量进行操作. 函数遍历时 美元的数组,只有当前值和键被传递给匿名函数回调. 没有通过的机会 美元的领 没有闭包的变量 使用 条款 . 我们可以用 全球 关键字, 但是使用一个只在我们非常有限的范围内有意义的变量会不必要地污染全局名称空间.

闭包还有其他面向对象的用途. PHP 5.4为关闭类的接口带来了新的方法. 具体来说,新 绑定绑定To 方法可以用来绑定到闭包要操作的新对象,例如.g.:

关闭:绑定To (newthis, newscope美元); 

This 方法 will actually duplicate 的 closure it自我 和 绑定 its scope to that new object, so 这个美元 实际上引用 newthis美元 在对象上下文中. 为了帮助说明,让我们修改 dogs_bark美元 函数使用 这个美元 然后把它绑定到一个新的 对象:

#定义闭包,但尚未绑定到任何对象
dogs_bark美元 = 函数() {
    echo 这个美元->sound;  # where this is a property
};
$new_dog = new 狗();
#现在创建一个新的闭包绑定到$new_dog对象
$new_closure = dogs_bark美元->绑定To($new_dog);
$new_closure();   # echoes 的 sound

闭包可以被赋值给变量,并且现在可以访问 这个美元 是很强大的. 特别是, 这意味着它可以成为另一个对象的可调用属性,并本质上成为该对象的方法. 例如:

$dog = new dog ();
$dog->closure = dogs_bark美元;
$dog->closure();

这使得在运行时更改和添加对象的行为功能成为可能,而不需要更改定义的类签名. 当需要增强功能时非常有用, 但是,实际的代码不能被修改,或者对增强功能的需求在范围内受到限制.

问:解释使用和目的 全球 在PHP中关键字. 提供一个适当使用它的例子, 还有一个不可能的地方.

在“PHP过时”的日子里, 该语言的面向对象实现远没有现在复杂. It is 的refore not uncommon to find older “legacy” PHP code that makes fairly extensive 使用 of 的 全球 关键字. 在许多方面, 过度使用全局变量是对现代面向对象编程(OOP)最佳实践的“公然挑战”, 因为它可能导致类之间的依赖纠缠在一起, 难以将完全不同的逻辑单元彼此分离, 全局命名空间被那些在该上下文中没有(或非常有限)使用的变量所污染.

考虑以下简单的例子:

狗类{
    函数树皮(){
        全球美元听起来;
        返回 美元听起来->bark();
    }
} 

的隐藏依赖项 关于全局的课程 美元听起来 object. 虽然在某些情况下,这是合理的.g., 一个有一组明确定义的声音的系统,而且永远不会被修改), 一般来说, 显式地通过相关的 美元听起来 对象的 class’ constructor, which would 的n be stored 和 使用d within that instance of 的 class; e.g.:

狗类{
    保护美元的声音; 
    函数__construct($声音){
        这个美元->sounds = 美元听起来;
    }

    公共函数bark() {
        返回 这个美元->getSounds()->bark();
    }

    公共函数getSounds() {
        返回 这个美元->sounds;
    }
}

但就像编程中的大多数事情一样,永远不要说永远. 有, 事实上, a number of 健壮的 和 stable products out 的re written in PHP that make heavy 使用 of 全球s. 的 Wordpress法典互联网上大约20%的网站都是由它提供的(而且每年都在增加), Joomla! 1.5 (至今仍在广泛使用),以及 iLance企业拍卖 system are all examples of projects that have been around for years 和 make 使用 of ‘mature’ 全球s. 类似的, 在某些情况下,在代码中使用全局变量是合适的, 但它们的使用应该始终谨慎.

问:描述PHP中的命名空间,以及它为什么有用.

PHP对OOP支持的新添加之一是 名称空间. 顾名思义, 命名空间定义了程序中类所在的作用域, 接口, 函数, 变量, 而且常量定义不会与其他名称空间中的类似命名项产生名称冲突.

在PHP 5之前.4, 为了与包层次结构匹配并避免名称冲突,类名通常会变得相当长. 例如,假设我们有一个 类的模型中定义的 狗_Pound 应用程序. 没有命名空间, 我们可能会觉得必须为类提供一个详细的名称,例如:

class 狗_Pound_Model_狗{#哇,这很拗口!
    get狗()函数;
}

命名空间允许开发人员显式地指定所有命名项(类)所在的名称空间,从而帮助缓解这个问题, 变量, 等.)是要被定义的. 使用命名空间,上面的详细类名可以被替换为:

名称空间 dog_pound\model;  # specify 的 current 名称空间

class 狗{#只在dog_pound\模型中定义“狗”
    get狗()函数;
}

$dogs = new dogs; # unambiguous 自 only one in this 名称空间

还支持相对名称空间引用. 例如,当在 dog_pound名称空间,你可以使用下面的实例化你的类:

$dogs = new model\ dogs #只有一个在dog_pound中定义的“模型”

此外, named items in o的r 名称空间s can be imported in o的r files 和 can 的n be referenced directly. 这是通过使用操作符完成的,如下所示:

名称空间 this\new\名称空间;  # our current 名称空间

#从dog_pound\模型命名空间导入狗并引用它
使用dog_pound \ \狗模型;

$dogs = new dogs;

问:有什么特质? 描述它们的主要特点和为什么它们有用. 给出一个trait声明的例子和一个使用多个trait的类.

特征 是PHP 5的优秀补充吗.允许将行为添加到类中, without needing to extend a parent class to inherit 的 desired 功能ity (prior to PHP 5.4、这只能通过a来完成 mixin 运行时的类模式). 此外,你可以在一个类中使用多个特征. This makes 的m a powerful aid in 的 organizati在一个nd separation of concerns in 的 codebase 和, 像这样, 帮助尊重 组合在继承 设计原则.

下面是一些简单的特征定义例子:

{特征运动
    公共函数topSpeed() {
        这个美元->speed = 100;
        以100%的速度运行!" . PHP_EOL;
    }
    公共函数stop() {
        这个美元->speed = 0;
        回声”停止移动!" . PHP_EOL;
    }
}

特征说{
    公共函数makeSound () {
        echo 这个美元->sound . PHP_EOL; 
    }
}

使用 关键字再次被使用, this time for importing from ano的r 名称空间 to include one or more traits in a class definition. 例如:

狗类{
    使用 Movement, Speak;  // 狗 now has 的se capabilities!

    保护美元的声音;
    
    函数__construct () {
        这个美元->sound = 'bark';
    }
}

$dog = new dog ();
$dog->topSpeed();  // from Movement trait
$dog->stop();      // from Movement trait
$dog->makeSound (); // from Speak trait

PHP触手可及

把在语言规范或API文档中很容易找到的东西放在内存中并不能说明熟练程度. 但这说, 对编程语言非常熟悉的人对语法和函数的细节和细微差别了如指掌. 这里有一些问题可以帮助你评估应聘者在这方面的专业知识.

问:描述两者之间的关系 php: / /输入$ _POST. 如何访问 php: / /输入 流?

用最简单的术语来说 $ _POST Super全球是使用post方法向服务器发出的请求体的格式化或解析内容.

POST / php-hiring-guide / php-post.php HTTP / 1.1
主持人:eisstocksport.net
推荐人:http:///toptal.php / php-hiring-guide / php.php
内容类型:应用程序/ x-www-form-urlencoded
内容长度:63
article_name = PHP招聘指南&tag_line =你被录用!&action =提交

的 body of 的 request can be accessed through 的 PHP’s input 流 的 same as any o的r file:

输入=美元file_get_contents(“php: / /输入”); 

Q:命名并定义至少5个以 $_. 描述他们之间的关系 美元的全局变量 变量.

  • $ _POST -通过post方法发送给服务器的键值对的哈希值
  • $ _GET -使用get方法发送给服务器的键值对的哈希值
  • $ _REQUEST -融合 $ _GET$ _POST
  • $ _SERVER 一个由web服务器设置的变量的哈希值, 和程序的执行有关
  • _ENV美元 -一个与主机及其配置相关的变量的哈希值
  • _SESSION美元 —一个变量的哈希值,在页面视图或单独的应用程序执行之间持久化
  • _COOKIE美元 -存储在客户端的变量的哈希值
  • 带有_file美元 - a special type of request hash that holds input data related to an uploaded set of files

与PHP中的全球关键字类似的是 美元的全局变量 超全局变量. As 的 name suggests, super全球s are automatic 全球 变量 和 像这样 are stored in 美元的全局变量. 例如, _ENV美元 超全局变量也可以通过 全局美元(“_ENV”).

问:解释使用的目的和用法 __get, __set, __isset, __unset, __call, __callStatic “神奇”的方法. “何时”、“如何”和“为什么”(也许还有“为什么不”)应该分别使用?

我们列表中的前四个方法, __get, __set, __isset, __unset 用于 财产重载 一个对象的. 它们让我们定义外部世界如何能够与具有私有或受保护可视性的属性交互, 还有对象中根本不存在的属性.

# “胡须”不是在狗类中定义的,而是由
#狗类的__get方法如下:
函数__get(美元的名字){
    If (美元的名字 == “胡须”) {
        #每个实例只创建一个胡须Service
        if (! isset(这个美元->胡须Service)) {
            这个美元->胡须Service = new Whiskers(这个美元);          
        }
        #所以调用“胡须”将加载wiskersService
        返回  这个美元->胡须Service->load();
    }
}

然后调用者可以简单地检索 胡须 房地产就像这样:

$hairs = $dog->胡须;

通过使用 __get 方法来“拦截”这个看似公共属性的引用,我们就可以模糊一个或多个对象属性的实现细节.

的使用 __set 方法是相似的. 例如:

函数__set(美元的名字, $价值) {
    If (美元的名字 == “胡须”) {
        if ($价值 instanceOf Whisker) {
            这个美元->胡须Service->setData($价值);
            返回 这个美元->胡须Service->getData();
        其他}{
            抛出新的WhiskerException(“那不是一个whisker”);
            返回错误;
        }
    }       
}

然后,调用者可以简单地设置 胡须 房地产就像这样:

$dog->胡须 = $hairs; 

语句自动调用 __set 方法,使用 “胡须” 作为它的第一个参数,而赋值的右边作为第二个参数.

最后, __isset__unset 方法完成四重奏. 它们都只有一个论点 美元的名字 of 的 property to be evaluated or operated on; e.g.:

函数__isset(美元的名字){
    If (美元的名字 == “胡须”) {
        返回 (bool) is_object(这个美元->胡须Service) &&
                                !空(这个美元->胡须Service->getData());
    }
}

函数__unset(美元的名字){
    If (美元的名字 == “胡须”) = “胡须” (美元的名字 == “胡须”) && is_object(这个美元->胡须Service)) {
        #我们不想完全关闭服务:
        这个美元->胡须Service->reset();
    }
}

另外两种方法, __call__callStatic,为类执行类似的函数,但给我们 方法重载. 通过它们的使用,我们可以定义类在未定义的情况下应如何反应, 受保护的, 或者调用私有方法.

在一个 __call 的实现,其中我们希望确保所有“不可见”的方法调用都返回 胡须Service 我们可以这样做:

公共函数__call($方法, $args) {
    返回 这个美元->胡须Service->load();
}

__callStatic 有相同的参数, 同样的功能,允许同样的交互, 但在特定对象上下文之外. 这意味着,如果定义了此方法,则可以使用 类名::notVisibleMethod () syntax; e.g.:

public 函数 __callStatic($方法, $args) {
    if (!is_object(静态::胡须Service美元)){
        静态::$胡须Service = new Whiskers(__CLASS__);
    }
    返回 静态::$胡须Service->load(); 
}

$毛=狗:胡须();

在上面的示例集中,我们封装了 胡须 implementation from 的 outside world 和 made it 的 only available object exposed in this way. 的 clients of such properties 和 方法s do not need to know anything about 的 underlying 胡须Service 或如何 类存储它的数据.

总的来说,这些方法增加了我们灵活组合对象的能力. 对象抽象和封装的机会, 因此可重用, 也增加了更紧凑的代码(最终形成了更易于管理的系统).

Care should be taken, though, in using 的se convenient 方法s, as 的 benefits can come at a cost. 它们比直接访问有问题的公共属性要慢, 也比定义的getter和setter慢. 它们还会妨碍某些有用功能的使用(例如 物体反射, autocomplete in your IDE, automatic documentation utilities like PHPDocumentor, so on). 所以如果你想要或需要依赖这些设施, 您可以考虑显式地定义方法和属性. 和大多数事情一样,没有一个全面的正确答案. 利弊应根据具体情况进行评估.

Q:描述一个或多个标准PHP库(SPL)数据结构. 给用法示例.

大部分的 PHP开发 处理从一个或另一个来源获取和处理数据, 例如本地数据库, 本地文件, 一个远程API, 等. 像这样, 开发人员花费大量时间获取, 组织, 移动, 处理这些数据. 在某些情况下, 在内存使用和性能方面,数组是不够的,因此需要更好的数据结构.

也, 有很多关于框架的讨论和关注(这个页面可以填满像CakePHP和Codeigniter这样的PHP框架的名字!), 要找到一个对项目使用的特定框架有丰富经验的开发人员可能会很困难. 这样一个活跃的开发社区的净效果是,使用特定框架的开发人员的分布开始缩小, 可能会让你更难找到特定的技能.

这是一个需要关注的领域, 并且您可以合理地确定专家级PHP开发人员会对它有所了解, 是在使用和一般的化妆吗 标准PHP库. 如果候选人有扎实的背景, 对于那些为您的应用程序工作并增加价值的候选人来说,成功的机会更大, 不管您的环境中使用的是什么特定的框架.

具体来说,候选人应该熟悉部分或全部 九种SPL数据结构 在PHP手册中列出. 许多都提供高度相似的功能, 但这些细微的变化使它们更适合于特定的用途. 以下是简要的概述:

  • SplDoublyLinkedList. Each element in this list holds links to 的 node before it 和 的 node after it in 的 list. 想象你在银行的网上, 但是你只能看到你前面和后面的人. 这类似于元素之间的“链接”关系 SplDoublyLinkedList. 在列表中插入一个元素就像在银行里有人插在你前面(但是你突然忘记前面是谁了), 那个人也会把你忘得一干二净). Enables efficient transversal through a dataset 和 lets you list 和 add large amounts of data, 内部不需要重新哈希.
  • SplQueueSplStack. 非常类似于 SplDoublyLinkedListSplQueueSplStack. 这两个都是 SplDoublyLinkedLists 使用不同的迭代器标记(IT_MODE_LIFO 是"后进先出"还有 IT_MODE_FIFO 是“先进先出”), 哪些控制读取元素的顺序,以及在处理这些元素之后如何处理它们. 另一个区别是 SplQueue API可能被认为更直观一些,提供一个 排队() 方法(而不是 push ())和一个 出列() 方法(而不是 转变()).
  • SplHeap. 内部表示为二叉树, 树中的每个节点最多有两个子节点. 它是一个抽象类,必须扩展才能定义 compare () 方法. This 方法 is 的n 使用d to perform real time sorting whenever a 价值 is inserted into 的 tree.
  • SplMaxHeapSplMinHeap. 的具体实现 SplHeap 抽象类. SplMaxHeap 提供了一个 compare () 方法以从高到低的顺序维护值,而 SplMinHeap 提供了一个 compare () 方法,该方法按照从低到高的顺序维护值.
  • SplPriorityQueue. 类似于一个 SplHeap,但是排序是根据为每个成员提供的额外的“优先级”值来完成的.
  • SplFixedArray. Similar to a regular array, but indices can only be integers 和 的 length of 的 array is fixed. 它在实现数组时提高了速度. 与数组相比,处理速度没有任何好处, 该接口经过了优化,因此添加元素时不需要手动对对象进行哈希处理.
  • SplObjectStorage. 为对象到数据的映射提供接口,或为一组对象提供容器. 本质上, 它可以使用类似于关联数组键的对象,将该对象与某些数据或根本没有数据相关联.

问:什么会 $x 等于后面的语句 $x = 3 + "15%" + "$25"?

正确答案是18. 现在让我们来解释一下原因.

PHP支持 自动类型转换 基于使用变量或值的上下文.

如果对包含字符串的表达式执行算术操作, 在计算表达式时,该字符串将被解释为适当的数字类型. So, 如果字符串以一个或多个数字字符开头, 字符串的剩余部分(如果有的话)将被忽略,数值将被解释为适当的数值类型. 另一方面, if 的 string begins with a non-numeric character, 的n it will evaluate to zero.

有了这样的理解,我们可以看到 "15%" 求值为数值15和 "$25" 计算结果为数值零,这解释了为什么语句的结果 $x = 3 + "15%" + "$25" 是18(我.e., 3 + 15 + 0).

这取决于你问谁, 自动类型转换要么是一个很好的特性,要么是PHP语言最严重的缺陷之一. On 的 one h和, when 使用d consciously 和 properly, it can be very convenient for 的 developer (e.g., I don’t need to write any code to convert “15” to 15 before using it in an arithmetic operation). 另一方面, it can easily lead to headfakes 和 hard-to-track-down bugs when it is employed inadvertently, 因为不会生成错误消息或警告.

问:解释使用的意义 静态 方法或属性时的关键字,包括它与 自我 关键字? 你会在什么时候使用它,为什么? 提供一个例子.

从PHP 5开始.3.0, PHP实现了一个叫做 延迟静态绑定. “延迟绑定”来自于这样一个事实 静态:: 不是使用定义方法的类来解析,而是使用运行时信息和作用域来确定. (顺便说一下, “静态”这个术语有点用词不当,因为它并不局限于静态方法.)

考虑以下例子:

狗类{
    $whoami = 'dog';
    $sound = '树皮';

    函数makeSounds () {
        回声自我:makeSound () . ', ';
        回声静态:makeSound () . PHP_EOL;
    }

    函数makeSound () {
        回声静态:whoami美元 . ' ' . 静态::$声音;
    }
}

狗:makeSounds ();

不出所料,这将输出“狗叫,狗叫”.

但现在让我们扩展这个例子,包括以下内容:

类小狗扩展了狗 {
    $whoami = '小狗';
    $sound = 'woof';

    函数makeSound () {
        回声静态:whoami美元 . “呜咽”;
    }
}

小狗:makeSounds ();

你可能会惊讶地发现,这将输出“小狗吠声,小狗呜咽声”。. 为了理解其中的原因,让我们回顾一下 makeSounds () 方法 class.

makeSounds () 方法首先调用 自我:makeSound (). 自我:: 指示PHP始终使用同一个类的作用域(在本例中,为 类). 因此,调用 自我:makeSound () 从内部 ’s makeSounds () 方法将始终调用 的版本 makeSound (). 这是真的,即使我们打电话 小狗:makeSounds ()小狗 没有 makeSounds () 方法本身,而不是依赖于 的版本. 这就是为什么来自 小狗:makeSounds () to 自我:makeSound () 输出“小狗汪”.

接下来, makeSounds () 方法 类调用 静态:makeSound (). 静态:: 行为不同于 自我::. 静态:: 指示PHP在运行时(在本例中)调用该方法的类的作用域中使用该版本, 的 小狗 类). 于是,当呼唤来 静态:makeSound () 是什么,它调用了什么 小狗的版本. 这就是为什么来自 小狗:makeSounds () to 静态:makeSound () 输出“小狗呜咽”.

PHP底层的

理解PHP如何“底层”工作是PHP专家的主要定义特征之一. 这样的候选人将不仅懂得如何做某事, 但是有各种各样的选择, 以及它们的性能和功能.

Q: PHP如何在内部构建数组?

PHP开发的核心是数组. 这对于需要可迭代数据结构的大多数场合都很有用. 在PHP内部,数组像许多其他数据结构一样,被存储为散列表. PHP是用C语言编写的,其中没有关联数组这样的东西:C语言中的数组只能有整数索引. 因此, 哈希函数用于将PHP数组索引(包括整数和字符串)转换为适当的数字索引,数组值存储在哈希表中的该位置或桶中.

的 process of finding bucket entries based 在一个 hash of 的 array keys is of O(1) complexity (using 大O符号). 这是因为不需要对哈希进行迭代, 因为哈希函数生成表中的确切位置. (注意,如果bucket中有多个元素,则会有轻微的变化.)

PHP会根据需要自动增加数组的大小. 具体地说, 当一个元素被添加到数组中时, 如果添加元素将导致数组超过其当前分配的大小, PHP的响应是将内存分配增加一倍. 因此,相应的哈希表需要完全重新哈希.

让我们考虑一下这意味着什么:在某些情况下,向数组添加值可能与遍历整个新数组一样复杂, 在同样的情况下,这个结构的内存占用增加了一倍. 鉴于这种, 哪里的数据集开始变大,内存是一个问题, 考虑一个替代数组可能是明智的, 在什么情况下,加载数据以进行处理是根据需要进行的.

问:两者的区别是什么 ArrayAccessArrayObject?

ArrayAccess 是一个简单的接口定义,它要求任何实现它的类定义以下方法: offsetGet, offsetSet, offsetExists, offsetUnset.

ArrayObject,另一方面,是一个实现 ArrayAccess 接口. 一个很好的使用方便 ArrayObject 它的元素可以吗 要么 与标准数组一样被访问(i.e.,通过熟悉的 [] notation; e.g., 狗美元(的声音)) or 通过 offsetGet (propertyName) 方法(e.g., $dogs->offsetGet('sound')).

问:什么是生成器? 什么时候可以用它来代替迭代器或普通数组. 是什么 收益率发送 do?

A 发电机 看起来很像PHP中的任何其他函数,并且与闭包有一些相似之处. 当第一次在一个可迭代的上下文中被调用时(e.g., foreach语句), 生成器返回一个对象,它是发电机类的一个实例, 它反过来实现了Iterator接口. 迭代的值是实时生成的,不需要事先将整个数据集加载到内存中. 这意味着结果可以像数组一样迭代, but with some important differences; namely 的y:

  • 只能在向前跑时使用吗, 这意味着不能对值进行向后迭代或从头开始. 调用 倒带() 方法将引发异常.
  • 比处理预先填充的数组慢(生成器正在进行额外的处理以产生值).
  • 内存效率极高.

生成器函数和其他PHP函数或闭包之间的主要区别之一是它们不使用 返回 提供他们的结果. 相反, 收益率 用于向生成器传递值(e.g., 收益率狗美元;). 事实上,指定一个 价值 在一个 返回 生成器中的语句将生成解析器错误,但是 返回 语句将完全停止生成器.

收益率 暂停执行并将当前值返回给正在使用生成器的结构的作用域. 该结构有机会在执行时的同一点通过 发送 方法(e.g., $发电机->发送(-1);).

有了这些基本的解释,让我们看一个生成器使用的简单示例.

首先,让我们定义我们的生成器:

函数dog_发电机 () {
    Foreach (range(0,2) as $价值) {
        一些虚假的数据源
        $狗= 狗Helper: get狗FromDataSource(美元值);
        # catch input from 发送或使用$dog
        $input = (收益率 $dog);    
        If ($input == -1) {
            返回; // stop 的 发电机
        }
    }
}

注意,在上面的示例中,我们将赋值 收益率 方法调用变量,因此必须包装 收益率 为了使它在语法上有效.

下面是我们如何使用上述生成器的一个例子:

#获取一个生成器实例,并将其赋值给一个变量
$发电机= dog_发电机 ();

Foreach ($发电机 as $dog) {# $dog是收益率的结果
    echo $狗 . PHP_EOL;
    //我们想找到那只小猎犬
    if ($dog == '梗') {
        #通过收益率向生成器发送一个输入
        $发电机->发送(-1);
        我们找到了猎犬,停止表演.';
    }
}

当我们运行上面的代码时,我们的例子在发现“梗”时停止. 例如:

达尔马提亚
梗
我们找到了小猎犬,停止表演.

生成器的主要优点是易于实现, 提高代码的可读性, 并且总体上提高了性能和内存使用.

所以一般来说, 最好使用生成器,这样就不需要在程序的另一部分中对值进行回退或迭代. 另一方面, if memory is not a concern, 的n a simple array of 的 价值s is much faster.

大局

Q: List some of 的 major differences between (or sequential additions 和 improvements to) PHP 5.3, PHP 5.4和PHP 5.5.

PHP 5.《PT视讯》早在2009年6月就发布了,但现在仍在广泛发行. 这个版本的关键新特性包括:闭包, λ风格功能, 命名空间, 以及后期静态绑定.

PHP 5.《PT视讯官网》于2012年3月上映, 引入特征, 此外,还可以用缩短的[]语法声明数组.g., 美元的数组 = ['shih tzu', 'rottweiler']). 此外, register_全球s 在这个版本中被删除了.

PHP 5.5于2013年6月发布,是目前的版本. 这个版本增加了对生成器(及其相关收益率和发送关键字)的支持, 以及在try/catch异常处理语法中添加finally. APC缓存被OpCache取代(基于Zend优化器). PHP 5.5还进一步接受数组字面量,并支持以下语法 [“狮子狗”,“罗特韦尔犬”][1] (which 返回s “rottweiler”) as well as 的 h和y notation of strings interpreted as arrays (e.g., '6, 5, 4'[0],返回“6”).

总结

在美国或国外找到专门的PHP开发人员相对容易, 而是寻找能够构建crm的优秀PHP开发人员, 修改CMS, 做程序开发, 或者更多是一个艰巨的挑战. 本指南中提出的问题可以作为您的招聘工具箱中的有用工具,以便更好地识别和聘用掌握这门语言的PHP程序员. 寻找这样的候选人是非常值得的, as 的y will undoubtedly have a significant positive impact on your team’s productivity 和 results.

精选的PHP出版物

顶级PHP开发人员需求量很大.

开始招聘