Обращение из одного класса к другому

Статус
В этой теме нельзя размещать новые ответы.
а то что написал diavolic - не слушай его ... - это он пошутил так

в приведенном в первом посте примере речь шла именно про использовании глобальной переменной внутри функции. в чем я неправ то был?

повторю его еще раз:

есть класс mysql database и есть ещё допустим один класс:

PHP:
require_once('database.class.php');
require_once('misc.class.php');

$db = new Database();
когда я в классе misc.class.php пишу функцию, которая обращается к базе данных:

PHP:
public function check_anything () {
$db->query($q);
}

почему то до класса mysql я не достукиваюсь:

Fatal error: Call to a member function query() on a non-object

ошибка возникает из за того что, по умолчанию пхп при появлении новой переменной не дает ей никакого типа. в данном примере была использована классовая ссылка, о которой пхп ессно ничего не известно, ибо переменная тупо не определена внутри функции. здесь речь НЕ ШЛА про определение класса, здесь речь шла уже об определенной переменной класса (уже существующем экземпляре класса) которую надо просто доопределить.
 
в приведенном в первом посте примере речь шла именно про использовании глобальной переменной внутри функции. в чем я неправ то был?

речь шла о получении доступа из одного класса (misc) к методам другого (database)

в классах нет никаких функций, есть лишь методы, и использовать глобальные переменные в них очень неверно ( особенно в контексте класс - бд_класс )
 
мм, чтоб объединить класс, используем extends, но в случае с классом БД, я обычно использую что-то вроде

PHP:
$db = new MySQL();

class test
{
   private $db;
   
   public function __construct ()
   {
       $this->db = $GLOBALS['db'];
   }
   
   private function blabla()
   {
      $this->db->query('SELECT...');
   }
}
Возможно не совсем правильно, но мне так удобно:)
 
речь шла о получении доступа из одного класса (misc) к методам другого (database)
в классах нет никаких функций, есть лишь методы, и использовать глобальные переменные в них очень неверно ( особенно в контексте класс - бд_класс )

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

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

вот пример, класс ChildClass наследуется от класса ParentClass
- следовательно класс ParentClass является родительским классом для класса ChildClass
...
Я говорил про родительский класс у пхп, а не у какого-то отдельного класса.
Хорошо, пример для вашего варианта + вопрос на засыпку: какой родительский класс у "ParentClass"? Надеюсь с первого раза понятно о чём речь, а теперь предлагаю вернуться в начало сообщения и продолжить мысль :)

думаю вам следует чуть глубже изучит ООП в целом, и в пхп в частности
Смешно слышать такие слова от человека, который пишет подобные вещи во всех класса "$db = new database();"

в пхп5 любой экземпляр класса передается по ссылке...
Это только твои фатазии. Если global работает из классов, значит оно так и задумано, а если тебе нравится убивать своё время только потому, что тебе лень написать 1 строчку, то это только твои проблемы.

Вот тебе и определение,

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

преимущество использования класса базы данных спроектированного по шаблону Singleton именно в том что он гарантирует наличие лишь одного экземпляра класса
и просто физически нельзя создать их больше, это будет контролироваться самим ПХП
( при условии что разработчик не напишет другой класс для работы с БД и не начнет его использовать, или же не будет работать с БД посредством функций )
в вашем же случае
PHP:
$db = new MySQL('root', 'pass', 'db');
программисту ничего не мешает написать что-то вроде
PHP:
$db = new MySQL('root', 'pass', 'db');
$db_1 = new MySQL('root', 'pass', 'db');
....
$db_1000 = new MySQL('root', 'pass', 'db');
class A { 
public function getX(){
   $local_db  = new MySQL('root', 'pass', 'db');
   ....
}
}
Ты не понял ничего.

Я понимаю что маленькими числами легко оперировать, а теперь представь, что тебе надо держать 1000 коннектов и по твоим словам мне надо передавать 1000 ссылок? Советую тебе почитать статьи по поводу ООП.
 
Интересная дискуссия развернулась:)
Так в итоге как правильно?

Я пока узаю способ Дьяволика с global $db; :)
 
В классе определяете переменную
Код:
....
private $db;
....
далее либо в конструкторе указываете
Код:
public function __construct(....,$db) {
....
$this->db=$db;
....
}
либо делаете сеттер
Код:
...
public function SetDb($db){
$this->db=$db;
}
...
и уже в методах класса используете через $this->db
 
У меня для таких дел существует класс registry в котором записываются все экземпляры необходимых классов (доступ к базе, валидаторы, шаблонизатор). А в остальных классах в контрукторе прописываю.
В начале автолоад
PHP:
define ('DIRSEP', DIRECTORY_SEPARATOR);
$site_path = realpath(dirname(__FILE__) . DIRSEP . '..' . DIRSEP) . DIRSEP;
define ('site_path', $site_path);
ini_set("include_path", ini_get("include_path").';'.site_path."classes");
function __autoload($class_name) {
	$filename = strtolower($class_name) . '.php';
	$file = site_path . 'classes' . DIRSEP . $filename;
	if (file_exists($file) == false) { 
        throw new Exception("Не могу загрузить ".$file);
		return false;
	}
	include ($file);
}
Затем создается экземпляр класса registry
PHP:
$reg=new Registry;
Сам класс выглядит так.
PHP:
class Registry implements ArrayAccess
{
    protected $vars = array();
    function set($key, $var)
    {
        if (isset($this->vars[$key]) == true) {
            throw new Exception('Unable to set var `' . $key . '`. Already set.');
        }
        $this->vars[$key] = $var;
        return true;
    }
    function get($key)
    {
        if (isset($this->vars[$key]) == false) {
            return null;
        }
        return $this->vars[$key];
    }
    function remove($var)
    {
        unset($this->vars[$key]);
    }
    function offsetExists($offset)
    {
        return isset($this->vars[$offset]);
    }
    function offsetGet($offset)
    {
        return $this->get($offset);
    }
    function offsetSet($offset, $value)
    {
        $this->set($offset, $value);
    }
    function offsetUnset($offset)
    {
        unset($this->vars[$offset]);
    }
}
Соответственно после его вызова можно создавать экземпляры других классов и записывать их в registry
PHP:
    $db = new MYPDO('mysql:host='.$host.';dbname='.$db.'',$user,$pass);
    $db->query("set names utf8");
    $reg->set('db',$db);
В остальные классы передается чеерез конструктор класс registry, который уже содержит все необходимые классы.
Например.
PHP:
$myclass = new Myclass($reg);
А в классе Myclass прописываем в конструкторе.
PHP:
class Myclass
{
    function __construct($reg)
    {
    	$this->reg=$reg;
    }
}
Соответственно в методах этого класса запрос к базе данных будет выглядеть так.
PHP:
$this->reg['db']->query("select ...... ");
Это из классической структуры MVC, которая меня вполне устраивает :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху