所以我有一个curl myCurl的类,我想将它用于我的其他2个类但是在那些类中我希望myCurl只有一个实例/是静态的,所以其他类的所有对象都将使用相同的curl对象
class mycurl {
...
}
我希望只有一个MyCurl实例的课程
class Company{
private static $curl=new Mycurl();
...
}
这不起作用syntax error, unexpected 'new' (T_NEW)
答案 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级卷曲对象。
假设您有三个类:MyCurl
,Class1
和Class2
,并且您只想在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()
。它首先检查是否已从Class1
或Class2
类调用此方法。如果是,则检查是否已为特定类创建实例。如果没有创建任何对象,则将创建新对象,否则该方法将返回旧对象。 Class1
和Class2
类都非常相似。在这些课程中:
private static
类变量$curlInstance
以保存MyCurl
类的实例。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();