Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Классы и переменные из внешних файлов


Автор: ArNic 29.9.2008, 02:08
Дано:
Есть файл jason.php с содержанием
Код

class Jason{
    public $end;
    var $MySQL;
    var $conn;
    function __construct(){
        $this->end = "";
        require_once('base.php'); //Основные функции объединенные в классы
        require_once('pars.php'); //Основные параметры (неизменяемые) - ну вы понимаете, типа данные для подключения к базе или префиксы. В данном случае $Prefix = 0001_
        $MySQL = new MySQL(); //Класс из файла base.php
        $conn = $MySQL->connect();
    }
    function __destruct(){
        echo $this->end;
        $MySQL->close($conn);
    }
    function Show($t){
        $this->end .= "SELECT * FROM `".$Prefix."Jason` WHERE `Name`='$t'\n"; //Вот сюда и не забрасывает переменную $Prefix :(
       }

Нужно:
Чтобы переменная из файла pars.php - перекочевала в jason.php
и чтобы при выполнении кода 
Код

$Jason = new Jason();
$Jason->Show('Register');

отображалось:
Код

SELECT * FROM `0001_Jason` WHERE `Name`='Register'


Пояснения:
Обращаюсь именно к профи, т.к. сидел за мануалами несколько суток, разобраться не смог. А значит сдался! Ситуация сложновата, т.к. нельзя по другому выполнять загрузку этих параметров, а только из pars.php

Автор: Sanchezzz 29.9.2008, 05:50
переменная Prefix выводятся принтом в конструкторе?

попробуй так
Код

 function Show($t){
 global $Prefix;
        $this->end .= "SELECT * FROM `".$Prefix ...

Автор: ArNic 29.9.2008, 10:22
Не получается - попробовал как ты мне сказал:
1) Print - в конструкторе вывел значение переменной
2) объявление глобальности для $Prefix - не дало результатов
Код

class Jason{
    public $end;
    var $MySQL;
    var $conn;
    function __construct(){
        $this->end = "";
        require_once('base.php'); //Основные функции объединенные в классы
        require_once('pars.php'); //Основные параметры (неизменяемые) - ну вы понимаете, типа данные для подключения к базе или префиксы. В данном случае $Prefix = 0001_
        $MySQL = new MySQL(); //Класс из файла base.php
        $conn = $MySQL->connect();
    }
    function __destruct(){
        echo $this->end;
        $MySQL->close($conn);
        print $Prefix."\n";
    }
    function Show($t){
        global $Prefix;
        $this->end .= "SELECT * FROM `".$Prefix."Jason` WHERE `Name`='$t'\n"; //Вот сюда и не забрасывает переменную $Prefix :(
       }

Выходит вот что
Код

0001_
SELECT * FROM `Jason` WHERE `Name`='Register'



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

Автор: krundetz 29.9.2008, 12:13
Ну во первых начнем с того что то как вы делаете концептуально не верно, если вы используете классы.

Во вторых что вам мешает в классе сделать дополнительную переменную которая и будет подставляться в запрос. А переменную назначать через соответствующей метод дибо через конструктор.

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

Автор: teroni 29.9.2008, 12:13
А чего нельзя просто константами сделать Ваши переменные? Они доступны из любой области видимости.

Автор: ArNic 29.9.2008, 12:27
Сейчас попробую

Автор: krundetz 29.9.2008, 13:27
Цитата(teroni @ 29.9.2008,  12:13)
А чего нельзя просто константами сделать Ваши переменные? Они доступны из любой области видимости.

Конечно же можно. Но тогда можно и без классов обойтись. Если уж используются классы то следует использовать концепцию ООП. А в ней константа это статический член класса. О чем собственно я выше и говорил.

Автор: ArNic 29.9.2008, 21:33
Цитата(krundetz @  29.9.2008,  12:13 Найти цитируемый пост)
Во вторых что вам мешает в классе сделать дополнительную переменную которая и будет подставляться в запрос. А переменную назначать через соответствующей метод дибо через конструктор.

Пример можно?

Автор: sTa1kEr 30.9.2008, 12:58
Цитата(krundetz @  29.9.2008,  14:27 Найти цитируемый пост)
Если уж используются классы то следует использовать концепцию ООП. А в ней константа это статический член класса.

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

ArNic, у вас в классе очень много логических ошибок, начиная от отсутствия указателей $this и заканчивая отсутствием какого-либо смысла в самом классе. По этому советую либо тщательно пересмотреть их архитектуру, либо отказаться от них вовсе. И, конечно же, для неизменяемых элементарных значений нужно использовать константы.

Автор: ArNic 30.9.2008, 22:19
Всем спасибо, если объявить 
Код
var $Prefix
 в начале класса, а потом в конструкторе сообщить 
Код
$this->Prefix = $Prefix;
 - будет всме нормально.
Благодарю за советы, я ими всеми воспользовался(а некоторыми еще воспользуюсь) (в нормальном смысле слова smile )  - постараюсь пересмотреть метод написания кода.
Да забыл сказать дале по коду все $Prefix - менял на $this->Prefix

Добавлено @ 22:25
Сразу вопрос sTa1kEr, а применение переменных типа $Prermen  внутри методов корректно? Или даже в этом случае нужно использовать $this->Peremen?

Автор: sTa1kEr 1.10.2008, 09:04
Цитата(ArNic @  30.9.2008,  23:19 Найти цитируемый пост)
а применение переменных типа $Prermen  внутри методов корректно? Или даже в этом случае нужно использовать $this->Peremen?

Использование локальных переменных внутри метода? Конечно-же корректно, если эти переменные были должным образом инициализированы, а не так:
Цитата(ArNic @  29.9.2008,  03:08 Найти цитируемый пост)

Код

    function __destruct(){
        echo $this->end;
        $MySQL->close($conn); // Здесь будет сгенерированна ошибка, т.к. переменной $conn не существует, существует только свойство $this->conn
    }

Автор: ArNic 1.10.2008, 20:25
ок, понял

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)