Questions tagged «php»

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

4
如何在PHP中以面向对象的方式传递数据?
我发现即使使用MVC框架(例如CodeIgniter),我也经常采用传递嵌套数组而不是对象的方法。 这不符合我对面向对象的理解。例如,如果我要将代码移植到Java,那么我就不会梦想像这样传递数组(或Vector,或其他任何东西)。 我想知道这是否是处理数据的适当方法。为什么有这样的原因在PHP中这样传递数组,或者为什么不使用对象呢?传递数据的最佳方法是什么?

7
如何使程序员停止编写易受SQL注入攻击的代码?
有时您会很忙,将一些小任务委派给初级程序员。但是,如果您没有给予足够的关注,您就会在生产中使用这种代码: class DivtoggleController extends Zend_Controller_Action { public function closeAction() { /* ... code removed for brevity ... */ $req = $this->getRequest(); $formData = $req->getPost(); $d = $formData['div']; $i = $formData['id']; $dm = new Model_DivtoggleManager(); $rs = $dm->setDivToggleById($d, $i); } } class Model_DivtoggleManager extends Zend_Db_Table { public function setDivToggleById($div, $id) { …
11 php  sql  training 

7
是否有人长期使用Python / Ruby和PHP并仍然偏爱PHP?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 我通常会对捍卫PHP的文章以及所使用的论点着迷。这些类型的文章的作者经常没有提及他们对其他语言的经验。我个人很难想象有人会同时了解Python或Ruby,以及PHP,并且仍然更喜欢PHP。 因此,如果有人适合这个描述,我将很想听听为什么您更喜欢PHP而不是这两种语言。

4
PHP 6发生了什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我对PHP 5.3+中预览的PHP 6中的更改感到很兴奋。但是,我想知道为什么要花这么长时间发布PHP 6?关于它的书籍自2008年以来已经出版,并且自2007年以来就已发布有关它的消息,但是我还没有听说过alpha或beta版本。为什么释放它需要这么长时间?还是所有语言过渡到主要版本(我估计大约需要4-5年的发布时间)后,这是所有语言的处理方式吗?

2
DDD中的例外
我正在学习DDD,并且正在考虑在某些情况下引发异常。我知道对象不能进入错误状态,因此这里的异常很好,但是在许多示例中,例如,如果我们尝试使用数据库中存在的电子邮件添加新用户,也会抛出异常。 public function doIt(UserData $userData) { $user = $this->userRepository->byEmail($userData->email()); if ($user) { throw new UserAlreadyExistsException(); } $this->userRepository->add( new User( $userData->email(), $userData->password() ) ); } 因此,如果存在使用此电子邮件的用户,那么我们可以在应用程序服务中捕获异常,但我们不应该使用try-catch块来控制应用程序的操作。 最好的方法是什么?

6
实体方法调用上的DDD注入服务
问题的简短格式 在DDD和OOP的最佳实践中,是否可以在实体方法调用上注入服务? 长格式示例 假设我们在DDD中有一个经典的Order-LineItems案例,其中有一个称为Order的域实体,它也充当聚合根,并且该实体不仅由其Value Objects组成,而且还包含Line Item的集合实体。 假设我们希望在应用程序中使用流利的语法,以便我们可以做类似的事情(请注意第2行中的语法,在此称为getLineItems方法): $order = $orderService->getOrderByID($orderID); foreach($order->getLineItems($orderService) as $lineItem) { ... } 我们不想将任何LineItemRepository注入OrderEntity,因为这违反了我能想到的几个原则。但是,语法的流畅性是我们真正想要的,因为它易于阅读和维护以及测试。 考虑下面的代码,指出该方法getLineItems中OrderEntity: interface IOrderService { public function getOrderByID($orderID) : OrderEntity; public function getLineItems(OrderEntity $orderEntity) : LineItemCollection; } class OrderService implements IOrderService { private $orderRepository; private $lineItemRepository; public function __construct(IOrderRepository $orderRepository, ILineItemRepository $lineItemRepository) { $this->orderRepository …

8
如何在不向竞争对手公开秘密的情况下安全地调试PHP Web应用程序?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 最近我做了一个程序。我忘记删除2行代码。这个错误每天使我每天损失$ 800。 我当时在用PHP编程。如果访问者使用代理,它将重定向到其他地方。使用调试器是不可能的,因为某些代码包含ioncube。由于该程序无论如何都只是重定向到其他地方,因此很难看到代码的哪一部分被执行。 所以我到处都放了一堆调试信息。我以为我以后还是要删除它们。 当然,最自然的调试方法是将调试信息放入文件中。问题是我经常使用代理。因此,在更改程序后,我经常必须使用filezilla下载文本文件。通常,文本文件没有显示我认为应该显示的内容。最后,我决定只在网络上显示错误。 我考虑过使用调试模式。但是,恐怕我会忘记删除调试信息。 例如,如果用户执行?debuggingmode = 1,我考虑使用调试模式。但是,我对自己的竞争对手以某种方式可以猜出secret关键字感到疑惑。 我删除了大多数调试信息。我忘记删除一个,并且只有在用户使用来自正确国家/地区的代理服务器时才会显示一个。原来我没有来自正确国家/地区的代理,也没有意识到这一点。该程序运行24小时后,我将其上传到了我的主域。 我的竞争对手,使用代理,请参阅调试代码。他抄袭了这个主意,这就是我每天损失800美元的原因。 回想起来,我真的很难知道我哪里出了问题。我一直非常小心。却发生了。 如何在不向竞争对手公开秘密的情况下安全地调试PHP Web应用程序?
11 php  debugging 


3
如何通过Symfony使用外部RESTful API?
我们正在为我们的项目构建微服务架构,其中大多数前端Symfony应用程序与后端RESTful API进行交互。 问题在于,这种方法打破了严重依赖带有数据库的Doctrine的Symfony实体管理。Symfony通常使用Doctrine处理实体,从而使大部分工作自动化,而当我们必须从API访问外部数据时,就很难轻松地重现这一点。 例如,对于客户实体: 使用Doctrine,我们只需要定义Client类,现在就可以轻松地创建,更新和检索客户 使用REST API方法,可以通过API访问客户端,但是我们还有很多工作来定义如何创建(POST),更新(PUT),检索(GET)客户端等。 需要注意的是,客户端被多个应用程序使用,不仅是前端应用程序,还有专用的API。 我们是否应该使用类似于实体的方法来创建类,从而隐藏API调用的复杂性,在本地导入所有API数据并通过Doctrine或其他方式访问它们?

1
社交网络通知系统
背景 我正在为包含一些社交网络功能的客户端开发应用程序。我原本是在开发移动前端,但当时的情况也让我负责开发后端。 作为一般背景,我们的系统允许用户关注其他用户,并收到有关他们关注的人的通知,这是您期望从社交网络获得的。需要注意的是,只有一小部分用户(最多几百个)是可追踪的,并期望大多数用户群将关注这些个人中的至少一个。 在用户界面侧,我们将有一个带有数字的通知按钮,单击该按钮将带您进入通知屏幕。 问题 我一直在研究实现通知的策略,发现的大多数资源都指向在数据库中创建一个或多个通知表。(我喜欢的一个示例是此处接受的答案:https : //stackoverflow.com/questions/9735578/building-a-notification-system)。 让我烦恼的是,大多数数据库驱动的通知策略都要求为每个关注者的每个通知插入一行。因此,如果有一千人在关注​​Sally,我们将在相应表中插入一千行。那可扩展吗?如果我们到了成千上万的用户关注Sally并且她每天发表数十条帖子的情况,会发生什么? 我最初的想法是处理查询的所有问题:通知按钮上的数字将通过请求比上次访问通知屏幕最近发布的内容的行计数来获得,而单个通知将通过更详细的查询生成当您访问通知屏幕时。这种方法不需要写入或额外的存储空间,但是不灵活,可能会严重影响服务器。 设定 后端(由先前的开发人员建立)使用CodeIgniter和MySQL数据库。它目前在糟糕的GoDaddy共享托管帐户上运行,但我认为(希望吗?)在我们投入生产之前,将对其进行升级,并且托管软件包将随着用户的增长而扩展。 目前,我们唯一的前端是移动应用程序,但我们计划稍后再建立一个网站。我现在不关心从服务器获取有关通知的实时推送更新。 附录 我不专门研究后端,而我在那个部门负责。客户知道这一点,并且我已尽力解释这种性质的项目的范围,但是他们已经明确表示,在这一点上,他们将不信任任何其他人来从事该项目。在开始添加测试人员之前,我们可能还要再做一个月的工作,我才能获得任何类型的性能指标。我真的无法估计未来5年我们将拥有多少用户,或者我们将使用什么硬件,但是我认为客户希望有成千上万的用户或更多。 我希望这个问题足够具体,可以在此处发布。如果需要,我可以对其进行优化。请询问您是否有任何疑问,或者我省略了重要的详细信息。 tl; dr 当所有用户都只跟随数百人时,数据库驱动的通知系统是否会对长期可扩展性产生负面影响? 有没有一种方法可以使通知由数据库驱动,而无需为每个关注者的每个通知单独的通知行? 完全由查询驱动的通知系统是否具有可伸缩性,或者除了不向数据库写入任何数据以外,还具有其他优点? 我想得太早了吗?我是否应该仅构建一个目前可以使用的产品,并且由于客户预算有限并且我们不知道最终产品是否会流行,如果问题出现,我们可以担心对其进行优化吗?

2
HTTP请求/响应对象应该是不可变的吗?
我认为可以肯定地说,大多数Web应用程序都基于请求/响应范例。PHP从未对这些对象进行正式的抽象。一个小组正在尝试改变这一点:https : //github.com/php-fig/fig-standards/blob/master/proposed/http-message.md 但是,他们在不变性问题上有些偏颇。一方面,请求/响应对象通常在其生命周期内几乎不需要更改。另一方面,响应对象尤其经常需要添加HTTP标头。 此外,不变性从未真正在PHP领域流行。 人们在使用不可变的请求/响应对象时会看到哪些优势? 假设您要返回一个json对象。 $response = new JsonResponse($item); 漂亮又简单。但是事实证明,该请求是跨域资源共享(CORS)请求。生成响应的代码无关紧要,但是下游的某个过程将添加必要的Access-Control标头。保留原始响应并使用其他标题创建新响应有什么好处?还是严格来说是编程风格的问题。 请求对象更加有趣。它从相同的地方开始: $request = new Request('incoming request information including uri and headers'); 初始信息不需要更改。但是,随着请求的传递,通常需要添加其他处理信息。例如,您可能有一个URL匹配器,该匹配器决定应为给定请求执行什么操作。 $request->setAttribute('action',function() {}); 实际执行操作是下游流程的责任。您可能有一个可变的RequestAttributesCollection,它包装了不可变的请求,但在实践中往往有些尴尬。除了属性集合之外,您还可能有一个不变的请求。异常也往往很尴尬。处理此类要求有经验吗?

5
在MVC中,是否可以/应该在View中完成从模型的基本数据检索?
考虑到“瘦控制器,胖模型”的概念以及视图在需要输出数据时视图可以直接调用模型的普遍接受性,是否应该考虑处理视图中请求的“获取和显示”部分而不是控制器?例如(试图使代码相当通用): 控制者 <?php class Invoice extends Base_Controller { /** * Get all the invoices for this month */ public function current_month() { // as there's no user input let's keep the controller very skinny, // DON'T get data from the Model here, just load the view $this->load->view('invoice/current_month'); } } 视图 …

4
是否应该从页面本身抽象数据库查询?
当用PHP编写页面生成时,我经常发现自己写了一些乱七八糟的数据库查询文件。例如,我可能有一个查询来直接从数据库中获取有关帖子的一些数据以显示在页面上,如下所示: $statement = $db->prepare('SELECT * FROM posts WHERE id=:id'); $statement->bindValue(':id', $id, PDO::PARAM_INT); $statement->execute(); $post = $statement->fetch(PDO::FETCH_ASSOC); $content = $post['content'] // do something with the content 这些快速的一次性查询通常很小,但是有时我最终会遇到很大一部分数据库交互代码,这些代码看起来看起来很混乱。 在某些情况下,我通过创建一个简单的函数库来处理与帖子相关的数据库查询来解决此问题,并将该代码块简化为简单的代码: $content = post_get_content($id); 那太好了。或者至少直到我需要做其他事情为止。也许我需要获取五个最新帖子才能显示在列表中。好吧,我总是可以添加另一个功能: $recent_posts = post_get_recent(5); foreach ($recent_posts as $post) { ... } 但这最终会使用SELECT *查询,无论如何我通常通常并不需要它,但是它通常太复杂而无法合理地抽象。最终,我将获得针对每个用例的庞大的数据库交互功能库,或者在每个页面的代码中包含一系列混乱的查询。即使建立了这些库,我也会发现自己需要做一个以前从未使用过的小联接,而且突然我需要编写另一个高度专业化的函数来完成这项工作。 当然,我可以将这些功能用于一般用例和特定交互的查询,但是,一旦我开始编写原始查询,我便开始回落到直接访问所有内容的位置。要么这样做,要么我会变得懒惰,并且将开始在PHP循环中执行操作,无论如何,它们实际上应该直接在MySQL查询中直接完成。 我想问一下那些具有编写Internet应用程序的经验的人:可维护性的提高是否值得额外的代码行以及抽象可能带来的低效率?还是简单地使用直接查询字符串是处理数据库交互的可接受方法?

7
PHP中最可靠的会话存储是什么:内存缓存,数据库或文件?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 什么是处理PHP会话的最佳,最安全的方法。是将会话存储在以下位置的最佳方法: 数据库(更可靠,但瓶颈大,速度慢,不利于数据库使用率高的网站)? Memcache(超快,但分布更多的安全问题,服务器重新启动时丢失数据的可能性以及缓存已满时丢失数据的机会)? 文件(默认选项,我猜很慢,因为它从文件I / O读取和写入文件,降低安全性,等等)。 哪种方法最好?每种方法的问题和优点是什么?
10 php  session 


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.