Questions tagged «php»

有关PHP(一种广泛用于通用脚本语言,特别适合于Web开发)的问题。

4
是否可以介绍仅在单元测试期间使用的方法?
最近,我正在开发一种工厂方法。该方法是创建一个普通对象或包装在装饰器中的对象。装饰对象可以是全部扩展StrategyClass的几种类型之一。 在测试中,我想检查返回对象的类是否符合预期。当普通对象os返回时,这很容易,但是将其包装在装饰器中怎么办? 我使用PHP编写代码,因此可以ext/Reflection用来找出一类包装对象,但是在我看来,这似乎使事情变得过于复杂,并且有点像TDD的规则。 相反,我决定引入getClassName()从StrategyClass调用时将返回对象的类名的方法。但是,当从装饰器调用时,它将返回装饰对象中相同方法返回的值。 一些代码使其更清晰: interface StrategyInterface { public function getClassName(); } abstract class StrategyClass implements StrategyInterface { public function getClassName() { return \get_class($this); } } abstract class StrategyDecorator implements StrategyInterface { private $decorated; public function __construct(StrategyClass $decorated) { $this->decorated = $decorated; } public function getClassName() { return $this->decorated->getClassName(); } …
12 php  tdd 

5
多种方法优于切换的优势
我今天收到一位高级开发人员的代码审查,询问“顺便问一下,您反对通过switch语句分派功能吗?” 我已经在很多地方读到了关于如何通过切换到调用方法来泵送参数是不好的OOP,而不是可扩展的,等等。但是,我无法真正为他提供明确的答案。我想一劳永逸地解决这个问题。 这是我们的竞争代码建议(以php为例,但可以更普遍地应用): class Switch { public function go($arg) { switch ($arg) { case "one": echo "one\n"; break; case "two": echo "two\n"; break; case "three": echo "three\n"; break; default: throw new Exception("Unknown call: $arg"); break; } } } class Oop { public function go_one() { echo "one\n"; } public function …

5
什么时候最好将工作卸载到RDBMS而不是用代码完成?
好的,我会解决的:我是一个比数据库更好的编码器,而且我想知道关于“最佳实践”的想法是关于在SQL查询中还是在SQL查询中进行“简单”计算的。代码,例如此MySQL示例(我没有编写它,我只需要维护它!)-这将返回用户名,以及用户从上次事件开始的年龄。 SELECT u.username as user, IF ((DAY(max(e.date)) - DAY(u.DOB)) < 0 , TRUNCATE(((((YEAR(max(e.date))*12)+MONTH(max(e.date))) -((YEAR(u.DOB)*12)+MONTH(u.DOB)))-1)/12, 0), TRUNCATE((((YEAR(max(e.date))*12)+MONTH(max(e.date))) - ((YEAR(u.DOB)*12)+MONTH(u.DOB)))/12, 0)) AS age FROM users as u JOIN events as e ON u.id = e.uid ... 与在代码中进行“繁重”的提升相比: 查询: SELECT u.username, u.DOB as dob, e.event_date as edate FROM users as u JOIN events …
12 php  mysql 

3
使用严格类型输入时docblock类型提示是否多余
我有一个相当大的私有代码库,它已经发展了大约十年。我没有使用phpDocumentor,但是由于使用docblock节已经成为开源项目中的标准,所以我也为存储库中的所有公共方法采用了编写docblock的方法。大多数块仅包含一个小的描述以及所有参数和返回类型的类型提示。 随着静态分析的到来,这些类型提示已帮助我找到了很多不一致之处和可能的错误。最近,我已经使用PHP的typehints将整个代码库(现在在PHP7.2上运行)转换为具有所有参数和返回值的类型提示。现在我在想...这些docblock typehints是否多余?它需要进行大量工作,以使所有docblock与不断变化的代码保持同步,并且由于它们不添加任何新信息,我想知道完全删除它们是否更好。 一方面,即使有多余的内容,删除文档也感觉很糟糕。在另一种情况下,我真的很想打破已经重复进行提示的“不要重复自己做”的日常类型提示内容。
12 php  comments 

4
为什么在方法名称中使用连词是不好的命名约定?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在我的团队中,我们与一些软件架构师紧密合作。他们批准我们项目的所有设计决策,进行一些代码审查等。 我们的项目主要包括使用Symfony 2框架以PHP实现的后端功能。因此,在语法上,代码,命名约定和项目结构看起来几乎与Java的外观相同(Symfony 2鼓励采用这种结构)。我之所以这样说是因为特定于Java的约定也适用于我们的情况(如果可能)。 最近,他们提出了一些令我感到很奇怪的东西:所有方法的名称中都应带有连词,例如getEntityOrNull,setValueOrException等等。 这样的命名约定对我来说是非常错误的,但是我无法提出任何具体的论据或在线文章/页面来专门挑战这一点。 我想到的唯一的东西是: 此类信息应出现在方法的注释中,例如@return或@throws 在方法名称中使用连词(“和”,“或”等)通常表明未适当遵守“单一责任原则” 反对该命名约定的其他一些具体论点是什么?

7
在面向对象的语言中,对象应何时对自己进行操作,何时应对对象进行操作?
假设有一个Page类,它表示对页面渲染器的一组指令。假设有一个Renderer知道如何在屏幕上呈现页面的类。可以通过两种不同的方式来构造代码: /* * 1) Page Uses Renderer internally, * or receives it explicitly */ $page->renderMe(); $page->renderMe($renderer); /* * 2) Page is passed to Renderer */ $renderer->renderPage($page); 每种方法的优缺点是什么?什么时候会更好?什么时候会更好? 背景 为了增加一些背景知识-我发现自己在同一代码中同时使用了这两种方法。我正在使用名为的第三方PDF库TCPDF。在我的代码中的某些地方,必须具备以下条件才能使PDF呈现工作: $pdf = new TCPDF(); $html = "some text"; $pdf->writeHTML($html); 假设我希望创建页面的表示形式。我可以创建一个模板,其中包含用于呈现PDF页面摘要的说明,如下所示: /* * A representation of the PDF page snippet: * a …

1
从原点向外产生最大边数为3的边和顶点的算法
我正在为一个网站创建2D游戏,在该网站上,宇宙可以变得非常大(基本上是无限大)。最初,宇宙由6个与原点(0,0)等距离的恒星组成。我的任务是能够生成更多的恒星,这些恒星将具有相互连接的“路径”(边缘)。如何设计满足以下限制的算法: 恒星是向外随机产生的。(例如,新星的(x,y)坐标将在所有方向上从(0,0)缓慢向外移动,最好采用螺旋格式) 边缘不会交叉。 尽管应该有一些差异,但新星不应与其他星相距太远或太近。(例如必须有一个最小半径) 星星/点的倍数不得超过3。 鉴于所有这些都将存储在数据库中,该算法不会太昂贵。换句话说,我很想达到O(n)的复杂度(我不知道这是否可行)。 本质上,我要寻找的是一个螺旋状的星系,其中的恒星是图形上的点,恒星之间的行进由这些恒星之间的边缘描绘。 我需要解决的特定步骤是: 在尚未重合3的其他恒星附近随机产生一个点。 查找尚未有多重度3且不会产生边缘冲突的第一颗恒星。 如果星形距离最小x单位,则在两点之间创建一条边。 我尝试寻找解决方案,但是我的数学技能(以及关于图论的知识)需要大量工作。此外,将不胜感激与此问题有关的任何资源/链接。 这是我在想的一些伪代码,但是我不确定这是否还能奏效,并且我确定在经过10,000次等运算后,它的性能将无法令人满意。 newStar = randomly generated (x, y) within radius of last star from origin while(newStar has not been connected): for (star in the known universe): if(distance between newStar and star > x units): if(star has < 3 multiplicity): …

2
良好实践中的DRY原则?
我试图在编程中尽可能地遵循DRY原则。最近,我一直在学习OOP中的设计模式,最后又重复了一遍。 我创建了一个Repository模式以及一个Factory模式和Gateway模式来处理我的持久性。我在应用程序中使用数据库,但这没关系,因为如果我愿意,我应该能够换出网关并切换到另一种持久性。 我最终为自己创建的问题是,我为拥有的表数创建了相同的对象。例如,这些将是我需要处理表的对象comments。 class Comment extends Model { protected $id; protected $author; protected $text; protected $date; } class CommentFactory implements iFactory { public function createFrom(array $data) { return new Comment($data); } } class CommentGateway implements iGateway { protected $db; public function __construct(\Database $db) { $this->db = $db; } public function …

5
我应该只使用JSON来使用JSON吗
我正在使用PHP / MySQl后端构建一个学习博客站点。所有用户输入都使用POST请求中发送的表单进行处理。 使用JSON是否会使其更清洁或更易于维护或添加功能?还是我只是无缘无故地添加交换格式? 因此,从本质上讲,使用JSON最好地实现什么功能?
11 php  json 

2
PHP本地化,最佳实践或方法?
我正在本地化我的PHP应用程序。在选择最佳方法来实现相同目标方面,我有两难选择。 方法1:当前正在将要本地化的单词存储在php文件的数组中 <?php $values = array ( 'welcome' => 'bienvenida' ); ?> 我正在使用一个函数来根据需要提取并返回每个单词 方法2:是否应该使用存储相同字符串的txt文件? <?php $welcome = 'bienvenida'; ?> 我的问题是,就开发相同的速度和精力而言,哪种方法更好,为什么? 编辑:我想知道其中两种方法响应速度更快,为什么呢?此外,对上述代码的任何改进将不胜感激!
11 php  localization 

5
为什么我的班级比本书中的班级等级(初学者OOP)更糟糕?
我正在阅读PHP对象,模式和实践。作者正试图在大学里模拟一堂课。目标是输出课程类型(讲座或研讨会),并且该课程的费用取决于它是每小时课程还是固定价格课程。所以输出应该是 Lesson charge 20. Charge type: hourly rate. Lesson type: seminar. Lesson charge 30. Charge type: fixed rate. Lesson type: lecture. 当输入如下时: $lessons[] = new Lesson('hourly rate', 4, 'seminar'); $lessons[] = new Lesson('fixed rate', null, 'lecture'); 我这样写: class Lesson { private $chargeType; private $duration; private $lessonType; public function __construct($chargeType, $duration, …

1
评估PHP名称空间
我现在处于开源PHP项目的预发布阶段,我希望其他开发人员可以在自己的项目中使用该项目。该项目当前不支持名称空间,我正在尝试评估它是否应该使用名称空间或Dir_Subdir_Class的PEAR命名约定,这似乎具有所有相同的技术优点,而没有一些缺点。老实说,这不是一个容易的选择。 关于名称空间的一些注意事项: 我的项目试图通过提供比其他类似项目更简单的API来与众不同的方式之一。因为名称空间是新的,而且因为它们比PEAR命名约定更复杂,所以将它们引入代码库会使我的项目使用起来不那么简单。通过实施它们,我在易用性方面失去了一些差异。 虽然我看到了命名空间的一些好处,但它们似乎并没有解决使用PEAR命名约定的现代PHP产品中需要解决的问题。使用项目时,如果不存在命名冲突,则应尽量减少。 这文章给了我在采用的命名空间及其实施已不到恒星一些暂停。 我也很犹豫,跳上一个可能永远不会走的潮流。由于名称空间是PHP的新功能,因此我还不确定它们将成为标准的。 兼容性。几乎所有以前写过的PHP代码都不使用名称空间,因为它是一项新功能。如果不进行转换,其他库将不兼容。 使用名称空间的一些要点: 知觉。如果名称空间成为标准和最佳实践,那么没有它们,我的项目很快就会被视为不专业且过时的项目。 竞争。尽管一些竞争的PHP项目开始在其最新版本中使用名称空间,但许多项目尚未实现飞跃。现在这样做可以使我的项目在其他项目上有优势。 如果我现在在项目公开之前而不是之后进行转换,那以后的工作会更容易,因为我不得不暂时支持它的两个版本。 我想支持最佳实践,如果名称空间成为PHP的最佳实践,则我的项目应使用它们。 据我所知,您必须选择一种方法。你不能两者都做。有没有我没有考虑的观点?是否有任何客观的迹象(请不要烈火)指向或反对命名空间成为PHP的专业标准?我将不胜感激,您愿意分享任何见解或资源,因为我需要尽快做出决定。
11 php  namespace 

4
分页会减轻服务器负载吗?(理论)
我想知道分页背后的原因是什么?是否使用它是因为它从技术上限制了每页返回的行数,从而减轻了服务器的负担? 我想做一些没有分页的事情,但是鉴于我是新手(我是业余爱好者),开始怀疑它在技术上是否可行。
11 php  pagination 

3
自动化单元测试创​​建
有哪些策略可用于自动创建单元测试用例?为了能够至少生成一个不错的测试用例框架,您需要在每个类中研究哪些方面? 我意识到综合的自动解决方案不切实际,但是我想至少通过创建一个骨架来加快测试的创建速度。我不是在寻找代码示例,而只是在寻找一些从何处开始的建议或在何处进行过类似的示例,这样我就可以了解他们如何实现它以及可能的实现方式。 我对在PHP中创建单元测试框架的方法特别感兴趣,该方法没有提供其他语言提供的所有工具,例如完整的类型提示。
11 php  unit-testing 

5
使用Web的PHP开发时,Linux给我带来什么好处?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我将与一个朋友开始一个大型的PHP项目。这是我第一次使用PHP,我一直想知道是否应该尝试在Linux上进行开发,因为它是如此流行。 我曾经在Linux上有过一些经验,自从我知道vim以来,选择编辑器就很容易了(尽管我看过VS.PHP并让我从更改中退缩了)。 在开发PHP(或任何网络语言)时使用Linux是否有优势?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.