【发布时间】:2015-10-21 14:18:38
【问题描述】:
假设我有这门课
class Hello
{
/**
* Construct won't be called inside this class and is uncallable from
* the outside. This prevents instantiating this class.
* This is by purpose, because we want a static class.
*/
private function __construct() {}
private static $greeting = 'Hello';
private static $initialized = false;
private static function initialize()
{
if (self::$initialized)
return;
self::$greeting .= ' There!';
self::$initialized = true;
}
public static function greet()
{
self::initialize();
echo self::$greeting;
}
public static function changeGreet($new)
{
self::initialize();
self::$greeting = $new;
}
}
我有 2 个脚本,一个在命令行中运行。
cmdLine.php (php cmdLine.php)
for($i = 0; $i < 25;$i++){
echo Hello::greet() . PHP_EOL;
sleep(5);
}
还有一个我在浏览器中加载的。
browser.php
Hello::changeGreet('NewGreet');
我想,在第一次运行 cmdLine.php 之后。然后加载 browser.php,下次循环运行时问候语会改变,但它没有。
仅使用 PHP 就可以做到这一点吗?
【问题讨论】:
-
您可以通过 shell_exec php.net/manual/en/function.shell-exec.php 或类似函数调用 shell 命令。
$result = shell_exec("cmd")将在一个变量中为您提供完整的返回字符串。 -
抱歉,可能不清楚,这不是我遇到问题的命令行,我在终端中运行此示例,这是从命令行脚本输出的消息运行 browser.php 脚本时不会更改。
-
我认为这两个脚本都是由服务器在单独的进程中运行的,所以这是不可能的。如果您使用了一些不同进程可以共享的存储(文件系统、数据库等)。
-
浏览器和命令行将在不同的进程中运行,因此将使用不同的类实例。如果不使用某种方式来存储类的状态,你将无法得到你想要的
-
看起来就是这样。是时候重新考虑如何让这样的事情发挥作用了!
标签: php static-methods