2016-06-12 3 views
1

Итак, у меня есть класс для curl myCurl, и я бы хотел использовать его для двух других классов, но в этих классах я хочу, чтобы myCurl имел только один экземпляр/был статичным, поэтому все объекты этих других классов будет использовать тот же объект curl.Инициализация статического завитка в классе

class mycurl { 
    ... 
} 

А класс, который я хочу иметь только один экземпляр MyCurl

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

Это не работает syntax error, unexpected 'new' (T_NEW)

+0

*. .. Я хотел бы использовать его для двух других классов, но в тех классах я хочу, чтобы myCurl имел только один экземпляр/был статичным, поэтому все объекты этих других классов будут использовать один и тот же скручивание объект. * Исходя из вашего требования, кажется, что вы ищете [Singleton pattern] (http://stackoverflow.com/questions/203336/creating-the-singleton-design-pattern-in-php5). –

+0

Вы можете назначать значения, а не объекты, во время разработки. Время выполнения можно присвоить объекту свойствам, инициализируя класс в конструкторе или на заводе. Единственное другое значение, которое он принимает внутри класса, является константой в классе * same *. –

+0

@ RajdeepPaul Ну, я хотел бы иметь отдельный объект завитки в разных классах, так что в основном 1 объект curl class 1. – Higeath

ответ

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; 
    } 
} 

Таким образом, он выиграл» t быть инициализированным, пока вы на самом деле не нуждаетесь в нем.

+0

Было бы более целесообразным сделать curl class singleton и постоянно менять все его свойства между классами или таким образом? – Higeath

+0

Я не знаю, правильно ли я его читаю, но вот мои 50 центов ... Было бы разумно создать новый экземпляр завитка для каждого индивидуального вызова. Параметры вызова предыдущего вызова не сбрасываются после завершения вызова. Таким образом, вы можете непреднамеренно отправлять (ошибочные) данные в следующую конечную точку ... Так что фактически создание «статического» объекта curl не так уж и мудрено ... –

+0

Ну, основной параметр завивки для этого класса остался бы таким же и до вызова Я изменяю только этот завиток CURLOPT_URL, чтобы он всегда получал правильные данные. – Higeath

1

Вы должны сделать это так:

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

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

     return $mycurl; 
    } 
} 
+0

Хорошо, что создаст новый Mycurl для каждого объекта Компании, которого я пытаюсь избежать. – Higeath

+0

это создаст статический var внутри метода, который не используется совместно с остальным миром, но разве это плохо для того, чтобы создать новый объект для каждого вызова, как в моем старом примере? По крайней мере, вы начинаете новый старт ... И просто подумайте, как часто он будет использоваться повторно так же, как и первый звонок ... Это очень небольшая вероятность ... –

1

От вашего комментария,

Я хотел бы иметь отдельный объект завитка в другом классе так в основном 1 класс 1 завиток объекта.

Предположим, у вас есть три класса: MyCurl, Class1 и Class2, и вы хотите использовать только один экземпляр MyCurl в 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. Это предотвращает создание объектов из-за пределов класса.
  • Создайте метод класса staticgetInstance(). Сначала он проверяет, был ли этот метод вызван либо из класса Class1, либо из класса Class2 или нет. Если это так, он проверяет, был ли экземпляр создан для определенного класса или нет. Если объект не был создан, будет создан новый объект, иначе старый метод будет возвращен этим методом.

И Class1 и Class2 класс совершенно такой же.В этих классах:

  • Создать private static переменная класса $curlInstance держать экземпляр класса MyCurl.
  • Создайте метод класса staticgetCurlInstance(), чтобы получить экземпляр класса MyCurl с использованием шаблона Singleton.

Чтобы получить уникальные 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(); 
Смежные вопросы