#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