Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос насчет области видимости переменной 
:(
    Опции темы
1234ru
Дата 6.8.2009, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 26.8.2007

Репутация: -1
Всего: -1



Как бы так сделать, чтобы функция A, вызванная из другой функции, B, могла увидеть переменную, которая задается в B, но в A явно не передается? 
(передавать $x в B напрямую нельзя, потому что B - это callback-функция для preg_replace_callback() и ничего там не передашь, кроме массива совпадений)
Код
function A()
    {
    $x = 1;
    // далее тут работаем с $x
    B(); // вызвали B() без явной передачи $x
    // теперь работаем со значением $x, измененным функцией B
    ...
    }

Можно ли это как-то сделать? 
PM MAIL   Вверх
lelik133
Дата 6.8.2009, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 517
Регистрация: 5.2.2003
Где: Москва

Репутация: 5
Всего: 14



поместить $x в глобальную область видимости
PM ICQ   Вверх
1234ru
Дата 6.8.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 26.8.2007

Репутация: -1
Всего: -1



Не пойдет. 
Переменная $x нужна только внутри A() и B(). Функция A() должна быть, грубо говоря, "под ключ" - тот, кто вызывает функцию A(), должен лишь вызывать её и ничего больше (при этом не думать о том, что надо еще и глобальные переменные какие-то устанавливать).
PM MAIL   Вверх
patap
Дата 6.8.2009, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



переделай все в класс )


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
lelik133
Дата 6.8.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 517
Регистрация: 5.2.2003
Где: Москва

Репутация: 5
Всего: 14



а ему и не надо устанавливать глобальные переменные, ее установите вы внутри  a(). Единственная проблема что вызывающий может по незнанию перезаписать ее значение.
или действительно используйте класс как предложил patap 
PM ICQ   Вверх
1234ru
Дата 6.8.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 26.8.2007

Репутация: -1
Всего: -1



А можно ли как-то класс использовать при вызове preg_replace_callback()?

Код
class foo {
    function A()
        {
        ...
        private $X; // или как надо сделать $x? просто var? (а то забыл :0 )
        preg_replace_callback($pattern, "$this->B", $str);
        ...
        }
    
    function B() // это callback-функция
        {
        $this->X = ... // работаем с X
        ...
        return $string;
        }
    }

PM MAIL   Вверх
SoWa
Дата 6.8.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Работаем с $x, и его-же в private прячем. Не, дай к нему общий доступ.

Это сообщение отредактировал(а) SoWa - 6.8.2009, 09:50


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
1234ru
Дата 6.8.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 26.8.2007

Репутация: -1
Всего: -1



А если я не хочу, чтобы можно было менять $x извне класса?
(вообще заранее хочу оговориться. что в классах я не силен, поэтому могу тупость иногда писать)

Это сообщение отредактировал(а) 1234ru - 6.8.2009, 10:05
PM MAIL   Вверх
patap
Дата 6.8.2009, 10:16 (ссылка) |  (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



Код

class Foo {
  private $x;
  
  public function a() {
    preg_replace_callback($pattern, $this->b(), $str);
  }
  
  public function b() {
    $this->x = ....
    return $str;
  }
}



--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
1234ru
Дата 7.8.2009, 15:40 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 26.8.2007

Репутация: -1
Всего: -1



Код
preg_replace_callback($pattern, $this->b(), $str);

Так не получается.
При выполнении такого кода в preg_replace_callback() будет вызываться не $this->b(), а функция с именем - строкой, которую $this->b() возвращает.

'$this->b()' и 'this->b()' также не работают (в двойных кавычках тоже)

Это сообщение отредактировал(а) 1234ru - 7.8.2009, 15:45
PM MAIL   Вверх
IZ@TOP
Дата 8.8.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Цитата(1234ru @  7.8.2009,  16:40 Найти цитируемый пост)
$this->b()' и 'this->b()' также не работают (в двойных кавычках тоже)

Надо так:

Код

$text = preg_replace("/([a-z]+)/e", "\$this->methodName(\"\\1\", \"$this->x\")", $text);



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Pfailed
Дата 8.8.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39



Из личного опыта:
Код

preg_replace_callback('@(openImage\s*\(\s*\')(\d+)(\',\s*\')(.+?)(\'.+?)(src\s*=\s*")(/)(.+?)"@i', array($this, 'md5img'), $preg[1])



--------------------
PM MAIL   Вверх
1234ru
Дата 17.8.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 26.8.2007

Репутация: -1
Всего: -1



Короче. Надо вот как (похоже на то, что писал Pfailed):

Код
class myclass{
       public $N; // можно и private $N, как я понимаю
       function a($text) {
               return preg_replace_callback('/something/', array($this, 'b'), $text);
       }
       function b($matches)    {
               $this->N += 1; 
               return 'something';
       }
}


upd:
Можно и так, как писал IZ@TOP, но так будет работать в 3-6 раз медленнее.

Это сообщение отредактировал(а) 1234ru - 27.8.2009, 13:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.