Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Проблема с работой класса.
Форумы портала PHP.SU » PHP » Программирование на PHP » Проблема с работой класса.

Страниц (1): [1]
 

1. MrSource - 31 Марта, 2011 - 21:27:08 - перейти к сообщению
Здравствуйте, для примера, есть слудующий код:
PHP:
скопировать код в буфер обмена
  1. $core = new core;
  2. $core -> init_config();
  3.  
  4. registry::get('config');


класс core:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class core {
  3.  
  4.         function init_config() {
  5.                 include('config.php');
  6.                 registry::set('config', $config);
  7.         }
  8.  
  9. }


класс registry:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. Class Registry Implements ArrayAccess {
  4.        
  5.         private $vars = array();       
  6.  
  7.         function offsetExists($offset) {
  8.  
  9.                 return isset($this->vars[$offset]);
  10.  
  11.         }
  12.  
  13.  
  14.         function offsetGet($offset) {
  15.  
  16.                 return $this->get($offset);
  17.  
  18.         }
  19.  
  20.  
  21.         function offsetSet($offset, $value) {
  22.  
  23.                 $this->set($offset, $value);
  24.  
  25.         }
  26.  
  27.  
  28.         function offsetUnset($offset) {
  29.  
  30.                 unset($this->vars[$offset]);
  31.  
  32.         }
  33.  
  34.         function set($key, $var) {
  35.  
  36.                 if (isset($this->vars[$key]) == true) {
  37.  
  38.                 throw new Exception('Unable to set var `' . $key . '`. Already set.');
  39.  
  40.                 }
  41.  
  42.  
  43.                 $this->vars[$key] = $var;
  44.  
  45.                 return true;
  46.  
  47.         }
  48.  
  49.  
  50.         function get($key) {
  51.  
  52.                 if (isset($this->vars[$key]) == false) {
  53.  
  54.                         return null;
  55.  
  56.                 }
  57.  
  58.  
  59.                 return $this->vars[$key];
  60.  
  61.         }
  62.  
  63.  
  64.         function remove($var) {
  65.  
  66.                 unset($this->vars[$key]);
  67.  
  68.         }
  69.  
  70.  
  71. }
  72. ?>


config.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $config = array(
  3.   '123' => '321',
  4.   '321' => '123'
  5. );


по сути требуется получить доступ к массиву, но я получаю ошибку:
Цитата:
Fatal error: Using $this when not in object context in K:\xampp\htdocs\classes\registry.class.php on line 53


Если сделать так:
PHP:
скопировать код в буфер обмена
  1. $registry = new registry;
  2. $core = new core;
  3. $core -> init_config();
  4.  
  5. $registry -> get('config');
  6. или
  7. $registry['config']

то доступ к массиву я всёравно не получаю, но ошибка уже не возникает...

прошу вас помочь решить проблему...
2. OrmaJever - 31 Марта, 2011 - 22:38:32 - перейти к сообщению
6 строка в клссе core вызывает статический метод класа registry но как видим в 34 строке класа registry он не статический. А ошибка возникает из-за того что не создан обьект и $this не может использоватся без обьекта.
Можно передавать сылку на клас

PHP:
скопировать код в буфер обмена
  1. class core {
  2.  
  3.         function init_config(&$registry) {
  4.                 include('config.php');
  5.                 $registry->set('config', $config);
  6.         }
  7.  
  8. }

PHP:
скопировать код в буфер обмена
  1. $registry = new registry;
  2. $core = new core;
  3. $core -> init_config($registry);
  4.  
  5. $registry->get('config');
3. MrSource - 01 Апреля, 2011 - 15:28:14 - перейти к сообщению
Но теперь, чтобы получить в любой функции доступ к регистру, нужно будет переменную $registry сделать глобальной в каждой функции.
Мне нужно, чтобы в любой функции можно было получить любое значение с помощью
4. OrmaJever - 01 Апреля, 2011 - 15:56:22 - перейти к сообщению
Ну если класс registry используется очень часто в core то можно обьект записать в свойство.
PHP:
скопировать код в буфер обмена
  1. class core {
  2.         public $reg = false;
  3.         function init_config() {
  4.                 include('config.php');
  5.                 $this->reg->set('config', $config);
  6.         }
  7.  
  8. }

PHP:
скопировать код в буфер обмена
  1. $registry = new registry;
  2. $core = new core;
  3. $core -> reg = $registry;
  4. $core -> init_config();
  5. $registry->get('config');

По-моему это лутше чем делать метод статическим. Растерялся
5. MrSource - 01 Апреля, 2011 - 16:02:55 - перейти к сообщению
OrmaJever пишет:

Ну если класс registry используется очень часто в core то можно обьект записать в свойство.
PHP:
скопировать код в буфер обмена
  1. class core {
  2.         public $reg = false;
  3.         function init_config() {
  4.                 include('config.php');
  5.                 $this->reg->set('config', $config);
  6.         }
  7.  
  8. }

PHP:
скопировать код в буфер обмена
  1. $registry = new registry;
  2. $core = new core;
  3. $core -> reg = $registry;
  4. $core -> init_config();
  5. $registry->get('config');

По-моему это лутше чем делать метод статическим. Растерялся



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

Вообще цель - создать универсальный класс, чтобы был доступ к определённым параметрам из любой части скрипта(инклуд, класс, функция и т.д.) без лишних телодвижений.
6. OrmaJever - 01 Апреля, 2011 - 16:42:21 - перейти к сообщению
хорашо можно зделать и так только тогда registry будет выглядеть так
Спойлер (Отобразить)

и все методы будут доступны registry::*
$this больше использовать нельзя.
7. MrSource - 01 Апреля, 2011 - 18:36:31 - перейти к сообщению
OrmaJever пишет:
хорашо можно зделать и так только тогда registry будет выглядеть так
Спойлер (Отобразить)

и все методы будут доступны registry::*
$this больше использовать нельзя.


Конструкция:
Цитата:
self::vars[$offset]

не обрабатывается, я так понял, что через self::* нужное значение из массива не получить...
8. OrmaJever - 01 Апреля, 2011 - 18:43:43 - перейти к сообщению
ой я не заметил, статические переменые вызываются self::$var, а я везьде написал self::var
Исправьте .
9. MrSource - 01 Апреля, 2011 - 18:46:34 - перейти к сообщению
OrmaJever пишет:
возможно я ошибся и строка с масивом будет выгляеть так


Не, там вообще синтаксическая ошибка вылетает:
Цитата:
Parse error: syntax error, unexpected '[', expecting '(' in K:\xampp\htdocs\classes\registry.class.php on line 9
10. OrmaJever - 01 Апреля, 2011 - 18:48:08 - перейти к сообщению
я исправил пост.
OrmaJever пишет:
ой я не заметил, статические переменые вызываются self::$var, а я везьде написал self::var
11. MrSource - 01 Апреля, 2011 - 18:51:35 - перейти к сообщению
OrmaJever пишет:
я исправил пост.
OrmaJever пишет:
ой я не заметил, статические переменые вызываются self::$var, а я везьде написал self::var


Я уже заметил, после того как ответил, кстати функции offset* не могут быть статическими Улыбка
(Добавление)
MrSource пишет:
OrmaJever пишет:
я исправил пост.
OrmaJever пишет:
ой я не заметил, статические переменые вызываются self::$var, а я везьде написал self::var


Я уже заметил, после того как ответил, кстати функции offset* не могут быть статическими Улыбка


OrmaJever, огромное спасибо за помощь Закатив глазки
12. JustUserR - 02 Апреля, 2011 - 19:10:16 - перейти к сообщению
OrmaJever пишет:
и все методы будут доступны registry::*
$this больше использовать нельзя.
В действительности использование определений функциональных объектов, осуществляемое в интерпретаторе языка PHP, в соответствии с поставленным условием целевой задачи, заключающеся в организаци инстанцированного получения ассоцированных значений информационных полей в пониженном базовом уровне трактования, предполагает возможность осуществление модификации информационной и действенной составляющей целевой координационной элементной области, вследствие чего в случае предшествующего обеспечения сопоставляемых объектных параметров в соответственном уровне трактования, возможно проведение решение оригинальной задачи

 

Powered by ExBB FM 1.0 RC1