Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Using $this when not in object context Внутри класса (https://javascript.ru/forum/server/49937-using-%24-when-not-object-context-vnutri-klassa.html)

Duda.Ml1986@gmail.com 04.09.2014 14:25

Using $this when not in object context Внутри класса
 
class ErrorReporting {

    protected $tableName;
    protected static $_instance;
    protected  $DB;

    public function __construct()
    {
        $this->DB = DB::getInstance();
        $this->tableName = 'error_reporting';
    }

    public static function getInstance() {
        // проверяем актуальность экземпляра
        if (null === self::$_instance) {
            // создаем новый экземпляр
            self::$_instance = new self();
        }
        // возвращаем созданный или существующий экземпляр
        return self::$_instance;
    }

    public static function setError($where, $what)
    {
        $sql = '';

А ТУТ НЕДОСТУПНА $this->tableName, почему недоступна, потому что метод статический, как увидеть?


        $sql = "INSERT INTO `error_reporting` (`where`, `what`, `date`, `ip`) VALUES ('".$where."',
                '".$what."','".date('Y-m-d H:m:s')."','".self::GetRealIp()."'
        )";

        self::writeError($sql);

    }

    protected function writeError($sql)
    {
       [B] $response = $this->DB->Insert($sql);[/B]
ВОТ НА ЭТУ СТРОКУ И МАТЕРИТСЯ 
"Using $this when not in object context"



        /*if ($response == 1) {
            return $this->DB->LastInsertId();
        } else {
            // ошибка при первом запросеa
            $this->error = $this->DB->getError();
            return false;
        }*/
    }

    private function GetRealIp()
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP']))
        {
            $ip=$_SERVER['HTTP_CLIENT_IP'];
        }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        else
        {
            $ip=$_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }
}



Как обратиться к другому обьекту который уже определен в переменной класса?

WorM32 04.09.2014 14:37

Ну дык у вас же $_instance есть, вот через него и вызывайте методы класса.

Duda.Ml1986@gmail.com 04.09.2014 15:21

Цитата:

Сообщение от WorM32 (Сообщение 328939)
Ну дык у вас же $_instance есть, вот через него и вызывайте методы класса.

Да не совсем в нем. Например

<?php

class DB{

    protected $mysqli;                                    // обьект работы с БД
    public $last_insert_id;                               //id последней измененной(INS/UPD/DEL) записи в БД
    public $error;

    private $host;
    private $login;
    private $pass;
    private $db_name;


    protected static $_instance;

    public function __construct(){

        /*
         * Данные для подключения к БД.
         */

        include_once('m/M_Constants.php');
        $M_Constants = Constants::Instance();



		$this->host = $M_Constants->host;
		$this->login = $M_Constants->login;
		$this->pass = $M_Constants->pass;
		$this->db_name = $M_Constants->db_name;
  	}

    private function Greate_Connect()
    {
        $this->mysqli = new mysqli($this->host, $this->login, $this->pass, $this->db_name);
        if (mysqli_connect_errno($this->mysqli))
        {
            $this->error .= "M_DB_Greate_Connect Не удалось подключиться к MySQL: " . mysqli_connect_error();
            //$this->error .= "M_DB_Greate_Connect Не удалось подключиться к MySQL: " . mysqli_connect_error();
        }
        $this->mysqli->set_charset("utf8");
    }

    public function getError() {
        return $this->error;
    }
    /**
     * Selecting from DB
     *
     * @param string $string - sql query
     *
     * @return array $data_array - array of selected data
     * @return NULL $data_array
     */
    function Select($string)
    {
        // подключение к ДБ
        $this->Greate_Connect();
        // запрос, в случае успеха true, 1
        if (!$result = $this->mysqli->query($string))
        {
            $this->error .= "M_DB_Select Неудалось выбрать из базы: %s\n" . $this->mysqli->errno . "<br/>" . $string;
            return false ;
        }else {
            while ($row = mysqli_fetch_array($result,MYSQL_ASSOC)) {
                $data_array[]=$row;
            }
            //закрытие соединения
            $this->mysqli->close();
            if(isset($data_array[1])) {
                return $data_array;
            } else {
                return $data_array[0];
            }
        }
    }

    public static function getInstance() {
        // проверяем актуальность экземпляра
        if (null === self::$_instance) {
            // создаем новый экземпляр
            self::$_instance = new self();
        }
        // возвращаем созданный или существующий экземпляр
        return self::$_instance;
    }

    // Insert в базе ,
    // return в случае успеха true or 1, false = 0, NULL
    function Insert($string)
    {
        // подключение к ДБ
        $this->Greate_Connect();
        // запрос, в случае успеха true, 1
        if (!$result = $this->mysqli->query($string))
        {
            $this->error .= "M_DB_Insert Неудалось записать в базу: %s\n" . $this->mysqli->error;
            return false ;
        }
        // запись id последней вставленной записи записи
        $this->last_insert_id = $this->mysqli->insert_id;
        //закрытие соединения
        $this->mysqli->close();
        return $result;
    }

    // Update в базе ,
    // return в случае успеха true or 1, false = 0, NULL
    function Update($string)
    {
        // подключение к ДБ
        $this->Greate_Connect();
        // запрос, в случае успеха true, 1
        if (!$result = $this->mysqli->query($string))
        {
            $this->error = "M_DB_Update Неудалось проапдейтить запись в базе: %s\n" . $this->mysqli->error;
        }
        // запись id последней обновленной записи
        $this->last_insert_id = $this->mysqli->insert_id;
        //закрытие соединения
        $this->mysqli->close();
        return $result;
    }

    // Delete в базе ,
    // return в случае успеха true or 1, false = 0, NULL
    function Delete($string)
    {
        // подключение к ДБ
        $this->Greate_Connect();
        // запрос, в случае успеха true, 1
        if (!$result = $this->mysqli->query($string))
        {
            $this->error .= "M_DB_Delete Неудалось удалить из базы: %s\n" . $this->mysqli->error;
        }
        // запись id последней удвления записи/ей
        $this->last_insert_id = $this->mysqli->insert_id;
        //закрытие соединения
        $this->mysqli->close();
        return $result;
    }

    // Возвразает id последней измененной записи
    // return int
    function LastInsertId()
    {
        return $this->last_insert_id;
    }

    private function __clone(){
    }

}
?>


Часовой пояс GMT +3, время: 04:27.