PHP示例化和后期静态绑定上下文

mwngjboj  于 2023-04-04  发布在  PHP
关注(0)|答案(1)|浏览(101)

简短版本

这段代码$out = new static();使PHP在Windows中使用xampp或wampserver意外地无声地退出。

长版本

我正在做一个旧项目,它可以在Ubuntu 15.10上用NGinX/php-fpm php5.5.9(dev)完美运行,也可以在Ubuntu 14.04上用apache2.4/Fast-CGI php5.5.13(production)完美运行。
今天,我的一个设计师同事刚刚查看了这个相同的repo来编辑一些html/css。
不幸的是,他无法在他的windows 10桌面上使用Xampp:v3.2.2(PHP 5.5.38)或Wampserver:2.5(PHP 5.5.13)运行该项目。
这段代码实现了一个老式的自制(类似于活动记录)数据库抽象层,其中所有的表都用一个类来表示,每个类都继承自Table类。
PHP在以下代码段(位于“Table”类中)停止:

# Table.php
public static function Get($id = null){
    echo 'test'; # Displays in the web browser
    error_log('test'); # append a line in the error_log file
    $out = new static(); # php seams to stop here
    echo 'after'; # Not displayed
    error_log('test'); # Not inserted in the log file
    // Fetch data from DB if id is specified
    if($id){
        $out->load($id);
    }
    return $out;
}

然后,他尝试将静态调用替换为:

// …
$class = get_called_class();
echo $class; # Displays "Article" (the right class name) in the browser
$out = new $class(); # The script dies silently as before.
// …

在windows上的后期静态绑定上下文中,PHP对象示例化似乎出现了问题。
非常感谢谁可以帮助解决这个问题。

dm7nw8vv

dm7nw8vv1#

显示完整的代码来演示这个问题。似乎对我来说,PHP 5.3.0或更新版本是有效的:https://3v4l.org/83ost

<?php

class MyTest
{
    protected $x = "";
    
    protected function __construct($x)
    {
        $this->x = $x;
    }
    
    public static function staticFactoryNew()
    {
        static $counter = 1;
        return new static($counter++);
    }
    
    public function identify()
    {
        echo "Instance of MyTest #".($this->x)."\n";
    }
}

class MyInheritedTest extends MyTest
{
    function foo()
    {
        echo "OK";
    }
}

$t1 = MyInheritedTest::staticFactoryNew();
$t2 = MyInheritedTest::staticFactoryNew();

$t1->identify();
$t2->identify();

$t1->foo();

相关问题