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
Вы вызываете статический метод, поэтому в этом контексте нет $this
.
Если вы хотите вызвать другой статический метод из данного класса, используйте self::method()
но если вы хотите вызвать нестатический метод, у вас возникла проблема. Сначала вам нужно создать новый объект.
Когда вы используете статические методы, вы не можете использовать $ this внутри
public static function activate($set, $where) {
return self::updatemain($set, $where);
}
Или вам нужно использовать дизайн singelton
query()
который является полностью методом экземпляра ... :) он не будет работать таким образом. Идея статических методов заключается в том, что они не сохраняют состояния. В архитектуре OP архитектура имеет слишком много зависимостей от объекта
РЕДАКТИРОВАТЬ
Лучшее решение - перепишите свой класс на один доступ к объекту 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
),
));
я надеюсь, что это поможет сделать ваш код лучше
ActiveRecord
и singletone
это убьет его :)
$this::query($sql, $params);