Доступ к нестатистическому свойству из статического метода

class database{ protected $db; protected function connect(){ $this->db = new mysqli( /* DB info */ ); // Connecting to a database } } class example extends database{ public function __construct(){ $this->connect(); } public static function doQuery(){ $query = $this->db->query("theQuery"); // Not working. $query = self::$db->query("theQuery"); // Not working. $query = parent::$db->query("theQuery"); // Also not working. } } 

Я хочу сделать что-то подобное, но я не могу найти способ, который работает, свойство должно статично …

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

Я проиллюстрирую на примере, этот код не работает :

 class Example { public $a; public __construct($a) { $this->a = $a; } public static getA() { return $this->a; } } $first = new Example(3); $second = new Example(4); // is $value equal to 3 or 4? $value = Example::getA(); 

Вы можете получить доступ, создав новый объект ( $self = new static; ). Пример кода:

 class database{ protected $db; protected function connect(){ $this->db = new mysqli( /* DB info */ ); // Connecting to a database } } class example extends database{ public function __construct(){ $this->connect(); } public static function doQuery(){ $self = new static; //OBJECT INTANTIATION $query = $self->db->query("theQuery"); // working. } } 

как сказал Марко. Вы не можете получить доступ к нестационарным свойствам из статических методов. если возможно, измените свое свойство на статичное, а затем ваш код будет работать.

Я сделал что-то вроде этого ..

 class Member_DashBoard extends Page { public static $lapsed_id = 4; //Membership lapsed status id //calling static function by passing static property $status_custom = self::getMembershipStatusLapsed(self::$lapsed_id);// $status_custom_id = $status_custom['id']; public static function getMembershipStatusLapsed($membershipStatusId) { $statusDetails = array(); $membershipStatus = new Core_MembershipStatus(); $membershipStatus->id = $membershipStatusId; if ($membershipStatus->find(TRUE)) { Core_DAO::storeValues($membershipStatus, $statusDetails); } return $statusDetails; } } 

надеюсь, что это поможет кому-то 🙂

–cheers

Похожие сообщения здесь

Единственным способом вызова нестатического метода из статического метода является наличие экземпляра класса, содержащего нестатический метод. По определению, нестатический метод – это метод, который называется ON экземпляром некоторого класса, тогда как статический метод принадлежит самому классу.

Лучше всего определять спецификации для объекта при его создании, и похоже, что ваша спецификация объекта не соответствует выбранному вами шаблону.

Как правило, вы должны спросить себя: «Мне нужно только иметь один экземпляр объекта (статический) или более одного?»

Для этого конкретного экземпляра (подключение и запрос к базе данных) создание экземпляра объекта для объекта базы данных нецелесообразно, если вам не нужно устанавливать несколько подключений к базе данных / с.

Таким образом, у вас есть прецедент для объекта instanced vs static. Несколько параллельных подключений могут перегружать базу данных в зависимости от конфигурации и количества раз, когда соединение создается за одно исполнение.

Поэтому, имея в виду, существует несколько шаблонов проектирования ООП для PHP, доступных для поддержки архитектуры объекта / с. См. http://www.slideshare.net/RobertGonzalez/object-oriented-design-patterns-for-php-presentation для хорошей прогулки по более распространенным образцам.

Для рабочего примера http://ideone.com/6qxvqx

Примечание. Я переименовал mysqli в mysqli2 и создал поддельный класс для обработки запроса и добавил отслеживание к созданию соединения и объекта.

 <?php interface iDatabase { static public function execute(); public function instantiatedExecute(); } abstract class database implements iDatabase { protected static $conn; /** * create an instance of database that uses the same connection across all instances */ final public function __construct() { self::connect(); } /** * Connect to a database if not already connected */ final protected static function connect() { if (null === self::$conn || false === (self::$conn instanceof mysqli)) { self::$conn = new mysqli( /* DB info */ ); //add error checking here... } return self::$conn; } /** * query database connection */ final public function query($query) { return self::doQuery($query); } /** * static query database connection */ final public static function doQuery($query) { //sanitize query here if desired return self::connect()->query($query); } } class example extends database { /** * example specific static execution */ public static function execute($query) { self::doQuery($query); } /** * example specific non-static execution */ public function instantiatedExecute($query) { $this->query($query); } }