Присвоение статической переменной класса php функции

#php #oop

#php #ооп

Вопрос:

Я хотел бы присвоить функции значение моей статической переменной. Но __construct никогда не выполняется со статическими вызовами. Итак, какой альтернативный путь я могу сделать, чтобы установить эту переменную, чтобы я мог повторно использовать ее много раз в своем классе?

 function sayhey(){
    return 'hey';   
};

// my class i do control
class Class1 {

    private static $myvar;
    
    public function __construct(){
        self::$myvar = sayhey();
    }
    
    public static function func1(){
        echo '<pre>'; print_r(self::$myvar); echo '</pre>';
    }

}// end class

// how can i make this work if the __construct never runs for static calls?
Class1::func1();

// obviously this works
//$class1 = new Class1();
//$class1->func1();

  

Комментарии:

1. Не кажется ли вам, что у вас плохой дизайн, если у вас есть статический класс, но вам нужен конструктор? Может быть, тогда класс не должен быть статическим?

2. @u_mulder Статического класса не существует, это статическое свойство.

3. Проблема, с которой он сталкивается, заключается в том, что начальное значение статического свойства должно быть постоянным, вы не можете вычислить его динамически.

4. Моя ошибка, должно быть — метод должен быть не статичным.

Ответ №1:

Попробуйте это

 <?php
function sayhey(){
    return 'hey';   
};

// my class i do control
class Class1 {

    private static $myvar;
    
    public function __construct(){
        self::$myvar = sayhey();
        //echo '<pre>11 '; print_r(self::$get_cart_contents); echo '</pre>';
    }
    
    public static function func1(){
        echo '<pre>'; 
        self::$myvar = self::$myvar ?? sayhey(); 
        print_r ( self::$myvar );
        echo '</pre>';
    }

}// end class

Class1::func1();
  

Комментарии:

1. Спасибо, мне нравится это, потому что это просто. Действительно ли self::$myvar когда-либо устанавливается? Я добавил func2() и попытался посмотреть, заполняется ли он когда-либо func1, но это не так, так что, может быть, нет смысла проверять, устанавливается ли когда-либо self:: $myvar? Вместо этого, возможно, я должен просто сделать $myvar = sayhey(); и повторно использовать для моих разделов нескольких классов

2. Нет, это не устанавливает значение. Мне пришло в голову использовать значение, а также использовать эту функцию в качестве установщика при инициализации класса .вот почему я использовал оператор объединения null. 🙂

Ответ №2:

В какой-то момент вам нужно инициализировать статическое свойство. Поскольку конструктор бесполезен для статических методов, это «заменяет» работу, выполняемую путем создания init() метода (также статического), который вызывается, когда self::$myvar имеет значение null (используя self::$myvar ?? self::init()

 function sayhey(){
    return 'hey';
};

// my class i do control
class Class1 {
    
    private static $myvar;
    
    public static function init(){
        self::$myvar = sayhey();
        return self::$myvar;
    }
    
    public static function func1(){
        echo '<pre>'; print_r(self::$myvar ?? self::init()); echo '</pre>';
    }
    
}// end class

// how can i make this work if the __construct never runs for static calls?
Class1::func1();
  

Ответ №3:

Вы также можете сохранить имя функции в переменной вместо результата вызова.

 function sayhey(){
    return 'hey';   
};

class Class1 {

    private static $myvar;
    
    public static function set($fct){
        self::$myvar = $fct;
    }
    
    public static function func(){
      $result = (self::$myvar)();
      return $result;
    }

}

Class1::set('sayhey');
echo Class1::func();  //hey
  

Я подозреваю, что черты лучше.

 trait myfunctions{
  public static function sayhey(){
    return 'hey';   
  }
}

class Class1 {
  use myfunctions;
}

class Class2 {
  use myfunctions;

  public static function fct1(){
    return self::sayhey();
  }
}

echo Class1::sayhey();  //hey
echo Class2::sayhey();  //hey
echo Class2::fct1();  //hey