在类中初始化静态curl

时间:2016-06-12 20:55:12

标签: php curl

所以我有一个curl myCurl的类,我想将它用于我的其他2个类但是在那些类中我希望myCurl只有一个实例/是静态的,所以其他类的所有对象都将使用相同的curl对象

class mycurl { 
   ...
}

我希望只有一个MyCurl实例的课程

class Company{
private static $curl=new Mycurl();
...
}

这不起作用syntax error, unexpected 'new' (T_NEW)

3 个答案:

答案 0 :(得分:3)

您无法在PHP中初始化类主体中的类实例。

为了让您的示例有效,您必须执行以下操作:

class Company {
    private static $curl;

    public function __construct() {
        if (null === static::$curl) {
            static::$curl = new Mycurl();
        }
    }
}

或者,可能会有更好的方式:

class Company {
    private static $curl;

    private static function curl() {
        if (null === static::$curl) {
            static::$curl = new Mycurl();
        }
        return static::$curl;
    }
}

这样,直到你真正需要它才会被初始化。

答案 1 :(得分:1)

你应该这样做:

class Company{
    public function getMycurlInstance()
    {
        static $mycurl;

        if ($mycurl === null) {
            $mysql = new Mycurl();
        }

        return $mycurl;
    }
}

答案 2 :(得分:1)

根据您的评论,

  

我想在不同的类中有一个单独的curl对象,所以基本上是1个1级卷曲对象。

假设您有三个类:MyCurlClass1Class2,并且您只想在MyCurl类和{1}}中使用一个Class1实例MyCurl类中Class2的实例,解决方案将是这样的:

class MyCurl { 

    private static $curlInstances = array( 'Class1' => null, 'Class2' => null);

    private function __construct(){}

    public static function getInstance($class){
        if(in_array($class, array_keys(self::$curlInstances))){
            if(self::$curlInstances[$class] == null){
                self::$curlInstances[$class] = new MyCurl();
            }
            return self::$curlInstances[$class];
        }else{
            return false;
        }
    }

    // your code
}

class Class1{
    private static $curlInstance;

    public static function getCurlInstance() {
        if(!isset(self::$curlInstance)){
            self::$curlInstance = MyCurl::getInstance(get_class());
        }
        return self::$curlInstance;
    }

    // your code
}

class Class2{
    private static $curlInstance;

    public static function getCurlInstance() {
        if(!isset(self::$curlInstance)){
            self::$curlInstance = MyCurl::getInstance(get_class());
        }
        return self::$curlInstance;
    }

    // your code
}

解释如下:

MyCurl课程中:

  • 创建一个private static类数组$curlInstances。此数组将用于检查是否已为特定类创建对象。
  • 制作构造函数方法private。它可以防止创建对象从类外部创建。
  • 创建static类方法getInstance()。它首先检查是否已从Class1Class2类调用此方法。如果是,则检查是否已为特定类创建实例。如果没有创建任何对象,则将创建新对象,否则该方法将返回旧对象。

Class1Class2类都非常相似。在这些课程中:

  • 创建private static类变量$curlInstance以保存MyCurl类的实例。
  • 使用Singleton模式创建static类方法getCurlInstance()以获取MyCurl类的实例。

要为这些单独的类获取唯一的MyCurl个实例,请执行以下操作:

$class1CurlInstance1 = Class1::getCurlInstance(); // returns only one instance of MyCurl class
$class2CurlInstance1 = Class2::getCurlInstance(); // returns only one instance of MyCurl class

再次,只是为了调试,请执行以下操作:

// Both $class1CurlInstance2 and $class2CurlInstance2 will have the same old unique MyCurl instances
$class1CurlInstance2 = Class1::getCurlInstance();
$class2CurlInstance2 = Class2::getCurlInstance();