让PHP方法同时使用$this和self

让PHP方法同时使用$this和self,php,singleton,this,self,Php,Singleton,This,Self,可以简单地使方法同时处理静态调用和实例化对象调用吗 例如: class MyClass { private static $instance = null; private $my_value = 'Foo'; public function __construct() { self::$instance = new self; } public static function my_function() { if( i

可以简单地使方法同时处理静态调用和实例化对象调用吗

例如:

class MyClass {
    private static $instance = null;
    private $my_value = 'Foo';

    public function __construct() {
        self::$instance = new self;
    }

    public static function my_function() {
        if( isset( $this ) ) {
            $target = $this->; // I know its an invalid declaration
        } else {
            $target = self::$instance->; // I know its an invalid declaration
        }
        return $target $my_value; // Invalid statement
    }
}

$my_object = new My_Class();
echo $my_object->my_function(); // Should output Foo
echo My_Class::my_function(); // Should output Foo

希望这是清楚的

不,这不是一个选项

方法可以是静态的,也可以是非静态的。

[正如kingkero提到的,您实际上可以。但是PHP报告了一个错误。因此,我写了一篇文章,您不能。阅读:您永远不想这样做!]

我无法想象一种情况,为什么需要使用
self::
$this->
调用一个方法

您可能想要实现单实例模式解释如下:


…你为什么要这样做?原因是我想看看我是否可以让一个单例对象返回相同的结果,无论该方法是静态调用还是从实例调用。单例对象,根据定义,是一个静态创建的对象,通过一些构造器的诡计来确保在任何给定的时间只有一个构造器存在。既然它是一个物体,你就应该把它当作一个。当然,这就引出了一个问题:为什么要在一个通常具有单个请求生命周期的环境中使用单例?默认情况下,是否通过引用传递对象?我发现单例在PHP中是完全不必要的。改用依赖注入。这是一种解决问题的更干净的方法,不会破坏范围。我感谢您的反馈/意见。这不适用于商业应用。我相信你们会欣赏我在修补一些代码,并且很好奇是否有什么事情,尽管它很尴尬,是可能的。没有人仅仅通过做推荐的事情来创新任何东西。实际上,你可以在非静态上下文中调用静态方法(反之亦然)——尽管它不会改变原始行为,并且会抛出错误/通知。在PHP中有一些关于这种行为的信息online@kingkero是的,你可以。你可以从50米高的桥上跳下来。事实上,你不会——我也不会求婚;——)此外,PHP可能最终禁止调用..感谢您花时间回复
class CSampleClass
{
    private static $instance;
    private $count = 0;

    private function __construct()
    {
    }

    public static function singleton()
    {
        if (!isset(self::$instance)) {

            self::$instance = new CSampleClass();
        }
        return self::$instance;
    }

    public function increment()
    {
        return $this->count++;
    }

    public function __clone()
    {
        trigger_error('Failed to create the clone', E_USER_ERROR);
    }

    public function __wakeup()
    {
        trigger_error('Sorry, ' . __CLASS__ . ' can"t be deserialized' , E_USER_ERROR);
    }
}