2015-08-03 1 views
0

я смотрю на учебники о CMS с объектно-ориентированного программирования - PHPPHP- вызова статической функции

мне нужно знать, как вызвать общественную статическую функцию из класса в одном файле или в том числе

по контролю страница:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

require_once('globals.php'); 



if(System::Get('db')->Execute("DELETE FROM `users` WHERE `id`= 2")) 
{ 
    echo "Done"; 
} 
else 
{ 
    echo "No"; 
} 
?> 

system.php:

<?php 
class System 
{ 
    //objects array 
    private static $objects = array(); 


    //store object 

    public static function Store($index,$value) 
    { 
     self::$objects[$index] = $value; 
    } 

    //return object 

    public static function Get($index) 
    { 
     return self::$object[$index]; 
    } 
} 
?> 

globals.php

<?php 

define('ROOT',dirname(__FILE__)); 
define('INC',ROOT.'/includes/'); 
define('CORE',INC.'/core/'); 
define('MODELS',INC.'/models/'); 
define('CONTROLLERS',INC.'/controllers/'); 
define('LIBS',INC.'/libs/'); 

/* 
core files 
*/ 
require_once(CORE.'config.php'); 
require_once(CORE.'mysql.class.php'); 
require_once(CORE.'raintpl.class.php'); 
require_once(CORE.'system.php'); 

System::Store('db',new mysql()); 
System::Store('tpl',new RainTPL()); //class RainTPL 
?> 

mysql.php

<?php 

/* 
* 
*/ 

/** 
* Description of mysqli 
* 
* @author syam 
*/ 


class mysql { 
    private $connection; 
    private $last; //last query 




    public function __construct() { 
     $this->dbconnect(); 
     $this->Execute('SET NAMES utf8'); 
    } 




    public function dbconnect() 
    { 

     $this->connection = new mysqli(HOSTNAME,USERNAME,PASSWORD,DBNAME); 
     if($this->connection) 
      return TRUE; 

     return FALSE; 
    } 





    public function Execute($query) 
    { 
     //$query = $this->connection->real_escape_string($query); 
     if($result = $this->connection->query($query)) 
     { 
      $this->last = $result; 
      return TRUE; 
     } 
     return FALSE; 
    } 
} 

мне нужно больше разъяснений

он называет функцию из класса системы таким образом

System::Get('db')->Execute("DELETE FROM `users` WHERE `id`= 2") 

мне нужно разъяснение по этому пути

и необходимо знать, как вызвать статическую функцию в правильном направлении

+0

Вы пробовали: '$ db = System :: Get ('db');'? Затем используйте его как: '$ db-> Execute (" DELETE FROM 'users' WHERE' id' = 2 ");' – Twisty

+0

Я уже пробовал и нашел, что это просто, но мне нужно хорошо понять эту строку – smile

ответ

2

Принимая взглянуть на исходный код, который мы можем видеть класс системы, который, как определено имеет два метода:

Магазин:

self::$objects[$index] = $value; 

Get:

return self::$object[$index]; 

По вы быстро поймете, что функция Get не вернет все, что было сохранено, поскольку объекты не являются тем же массивом, что и объект.Это typo

С этим исправлением все должно работать нормально, используя System :: Get, вы просто получаете экземпляр из класса mysql, а затем вы просто вызываете метод как обычно.

EDIT: в соответствии с просьбой здесь объяснение этого кода:

System::Get('db')->Execute("DELETE FROM `users` WHERE `id`= 2") 

разобьем это на две части. System::Get('db') calls Получить статическую функцию из системы, отправив строку db в качестве индекса. Как указано в globals.php, экземпляр mysql инициализируется в индексе «db», чтобы вернуть элемент mysql.

Во-вторых, -> в основном вызывает внутренние методы элемента, поэтому это означает, что в основном вы будете делать что-то похожее на $mysql->Execute(..). В этом случае для этого метода требуется строка в качестве запроса, поэтому вы в основном отправляете ее как параметр, который затем выполняется в mysql.php.

Надеюсь, я помог.

+0

да, теперь это работает, но System :: Get ('db') -> Execute ("DELETE FROM' users' WHERE 'id' = 2") вы можете это объяснить? – smile

+0

вы можете объяснить это скорее как jeremy, потому что мне нужно, чтобы вопрос объяснял для этого кода – smile

+0

'System :: Get ('db') -> Execute (" УДАЛИТЬ ОТ пользователей WHERE id = 2 ")'. 'System :: Get ('db')' вызывает метод Get, отправляющий db как индекс. Если вы проверяете globals.php, индекс db хранит объект mysql (как определено с помощью нового mysql(), который создает объект). Это возвращает (вы возвращаетесь) элемент mysql. У этого элемента есть методы. В вашем случае вы решили использовать метод Execute (который определен в mysql.php). Для этого требуется аргумент (строка), который вы отправляете (удалить из ...). Таким образом, в основном он выполняет эту функцию. Это в основном то, что происходит в вашем случае. Это все, что я могу объяснить в комментарии. –

0

Для вызова внешнего класса статической функции: {Classname} :: {StaticFunctionName}();

Чтобы вызвать внутренний класс статической функции: self :: {StaticFunctionName}();

Теперь ваш конкретный вызов: System :: Get ('дб') -> Execute ("DELETE FROM WHERE usersid = 2"); Класс System - это статический класс, который управляет экземплярами классов как singloton. Таким образом, вы можете называть везде те же синглотоны, как «db»;

Система :: Get ('db'): возвращает singloton класса 'db'. Это нестатический объект.

Система :: Get ('db') -> Выполнить: вызвать функцию «Выполнить» класса «db». Класс «db» должен быть балансировщиком между различными хранилищами. Ваша конфигурация должна быть установлена ​​в mysql. Итак, System :: Get ('db') -> Выполнить должен быть вызов mysql-> Execute().

Примечание: «УДАЛИТЬ ОТ users ГДЕ id = 2" => Если 'id' является основным ключом, добавьте в конце запроса «LIMIT 1». Он останавливает запрос после удаления 1 строки.

+0

Чтобы вызвать статическую функция внешнего класса, даже из другого файла с включенным правом? – smile

+0

Класс System - это статический класс, который управляет экземплярами классов как singloton. Таким образом, вы можете называть везде те же синглотоны, как «db»; могу ли я попросить об этом больше кальцификации? – smile

+0

пожалуйста, когда вы ответите на свое объяснение, что я хочу от вопроса :) – smile