Вызов функции внутри класса с $ this

0
User::updatemain($set, $where); 

Это дает фатальную ошибку: использование $ this, если не в контексте объекта. Мой класс пользователя распространяется из класса Dbase, и здесь функция пользовательского класса:

public static function activate($set, $where) {
    return $this->updatemain($set, $where);

вот класс dbase (часть):

private function query($sql = null, $params = null) {
    if (!empty($sql)) {
        $this->_last_statement = $sql;
        if ($this->_db_object == null) {
            $this->connect();
        }
        try {
            $statement = $this->_db_object->prepare($sql, $this->_driver_options);
            $params = Helper::makeArray($params);
                $x = 1;
                if (count($params)) {
                    foreach ($params as $param) {
                        $statement->bindValue($x, $param);
                        $x++;
                    }
                }
            if (!$statement->execute() || $statement->errorCode() != '0000') {
                $error = $statement->errorInfo();
                throw new PDOException("Database error {$error[0]} : {$error[2]}, driver error code is {$error[1]}");
                exit;
            }
            //echo $sql;
            return $statement;
        } catch (PDOException $e) {
            echo $this->formatException($e);
            exit;
        }
    }
}

public function updatemain($set, $where) {
    return $this->query($sql, $params);
}

это часть класса Dbase

  • 0
    Попробуйте $this::query($sql, $params);
  • 0
    как насчет self :: query ($ sql, $ params);
Показать ещё 4 комментария
Теги:

3 ответа

2

Вы вызываете статический метод, поэтому в этом контексте нет $this.

Если вы хотите вызвать другой статический метод из данного класса, используйте self::method() но если вы хотите вызвать нестатический метод, у вас возникла проблема. Сначала вам нужно создать новый объект.

1

Когда вы используете статические методы, вы не можете использовать $ this внутри

public static function activate($set, $where) {
       return self::updatemain($set, $where);
}

Или вам нужно использовать дизайн singelton

  • 0
    updateMain использует query() который является полностью методом экземпляра ... :) он не будет работать таким образом. Идея статических методов заключается в том, что они не сохраняют состояния. В архитектуре OP архитектура имеет слишком много зависимостей от объекта
  • 0
    @ Royal Bg .. я знаю, что :) все, что я сделал, указывал на ошибку оп ..
0

РЕДАКТИРОВАТЬ

Лучшее решение - перепишите свой класс на один доступ к объекту DB. И создайте классы модели для доступа к БД. См. Мой примерный код ниже:

основной AppCore

<?php
class AppCore
{
    public static $config  = array();
    public static $ormInit = false;

    public static function init($config)
    {
        self::$config = array_merge(self::$config, $config);
    }

    public static function db($table)
    {
        // ORM - see http://idiorm.readthedocs.org/en/latest
        if (!self::$ormInit) {
            ORM::configure(self::$config['db']['connection']);
            ORM::configure('username', self::$config['db']['username']);
            ORM::configure('password', self::$config['db']['password']);
            self::$ormInit = true;
        }
        return ORM::for_table($table);
    }
}

Модель пользователя

<?php
class UserModel
{
    const TABLE = 'user';

    public static function findById($u_id)
    {
        $result = AppCore::db(self::TABLE)->where('u_id', $u_id)->find_one();
        return $result ? $result->as_array() : null;
    }
}

Раздел инициализации AppCore

AppCore::init(array(
    'db' => array(
        'connection' => "mysql:dbname={$db};host={$host}",
        'username' => $user,
        'password' => $pass
    ),
));

я надеюсь, что это поможет сделать ваш код лучше

  • 0
    Когда вещи становятся ужасными ... просто делают их более ужасными? ОП должен исправить всю его доменную логику. Это полностью сломано :)
  • 0
    @ RoyalBg, если я предлагаю использовать ActiveRecord и singletone это убьет его :)
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню