2017-09-06 33 views
-1

我正在为测试目的编写一个简单的逻辑。当一个动作方法被调用时,我将获取作为参数传递给动作的id并将其存储在关联数组中。我写了一个静态函数来处理逻辑。我还有第二个问题,我想检查id是否已经作为关联数组中的键存在,如果是,我想增加计数器。但我可以为这个问题提出另一个问题。这个问题的目的是静态变量不工作。如何处理函数内部的PHP静态类变量

class UsersController extends Controller 

static $users= Array(); 

public function show($id) 
    { 
     $this::stats($id); 
    } 

private static function stats($id) 
    { 

     if( array_key_exists("{$id}", UsersController::$users)) 
     { 
      UsersController::$users["{$id}"] += 1; 
     } 
     else 
     { 
      UsersController::$users["{$id}"] = 1; 
     } 
    print_r(UsersController::$users); 
    } 

每次访问不同的用户www.example.com/users/2或www.example.com/users/1。 print_r语句显示数组中只存在一个元素。我是否缺少一些oop原理。我用C#编写了一个类似的代码,它的工作方式和预期的一样。

+0

为什么你是否将所有内容都包含在引号中?不要使用'“{$ id}”',使用'$ id',这样更具可读性。此外,可以使用关键字'static'来代替当前的类名称。这会在以后更容易重构。 – Devon

+0

@Devon:抱歉可能会劫持,但使用'self'还可以吗? – Kisaragi

+1

@Kisaragi,是的,但这取决于。有时候自我更好。它在扩展类时应用不同。例如:Controller中的self将始终引用Controller。 Controller中的静态会引用被调用的类(UsersController),允许扩展功能。 – Devon

回答

0

你不会错过任何OOP原则,你错过了PHP进程的标准实现。通常情况下,网络服务器被设计为执行php脚本然后死亡。当您访问两个不同的页面时,内存中没有持久性。

你可以实现PHP来继续使用相同的内存吗?当然可以,但是没有我知道的web服务器实现以这种方式工作。

大多数人使用会话(服务器端)或cookie(客户端)来保持跨多个请求的持久数据。

+0

是的,我的问题是因为处理请求的方式。 –

-1

您需要将数据存储在永久存储器中以通过多个请求持续存在。

每个PHP请求都是全新的执行。因此,如果它是你的C#代码,那就好像你退出了C#程序,重新启动了它并与第二个用户一起访问。

与PHP永久存储的常用来源包括像其存储在一个文件,数据库等

如果该数据的存储可以是每个用户,而不是一个大问题,如果失去了选择,你可以存储会话中(存储在服务器上,通常是文件中)或cookie(存储在客户端的浏览器中)。这些存储介质都不是非常可靠的,被认为是暂时的。

还有更临时数据存储的形式,并且它们包括像内存缓存(独立存储器基于存储介质),redis的(同上),APCu(可以内置PHP作为模块)等