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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как не копировать?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
dubasua
Отправлено: 17 Ноября, 2012 - 22:59:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Доброго времени суток. Задчка по оптимизации скрипта. Есть простой класс myClass, со статическим свойством $myVar и статическим методом getMyVar
PHP:
скопировать код в буфер обмена
  1.  
  2. class myClass{
  3.    static public $myVar = false;
  4.  
  5.    static public function getMyVar(){
  6.       if(self::$myVar){
  7.          $tmp = self::$myVar;
  8.          self::$myVar = false;
  9.          return $tmp;
  10.       }
  11.    }
  12.  
  13. }
  14.  

Задача метода, вернуть значение свойства и удалить его, ну или присвоить значение FALSE или NULL потому как оно больше не нужно.
На тот момент когда нужно получить значение свойства, оно просто громадное, и для того что бы его удалить, его нужно сначала скопировать, а уже потом удалить. Ну вот как-бы и вопрос: как обойти копирование, что бы вернуть результат без копирования.
 
 Top
armancho7777777 Супермодератор
Отправлено: 17 Ноября, 2012 - 23:08:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




В данном примере никак.
 
 Top
dubasua
Отправлено: 17 Ноября, 2012 - 23:13:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




А если записать в ob_start()?
(Добавление)
Гоню.....
 
 Top
EuGen Администратор
Отправлено: 17 Ноября, 2012 - 23:20:01
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




dubasua пишет:
static public function getMyVar()

Если у Вас есть подобный геттер, то получается, Вы кроме копирования локально в геттере, где-то еще копируете значение (Вы ведь используете геттер как-либо в выражении, либо наподобие $mVar = myClass::getMyVar()).
Так почему бы просто не отказаться от геттера, который вдобавок еще и ведет себя не как геттер (side-эффект в виде уничтожения переменной) - а попросту обращаться к переменной как есть, затирая ее значение в дальнейшем.
То есть - было:
PHP:
скопировать код в буфер обмена
  1. $mVar = myClass::getMyVar();//двойное копирование: внутри getMyVar и при присваивании

- стало:
PHP:
скопировать код в буфер обмена
  1. $mVar = myClass::$myVar;
  2. myClass::$myVar = false; //одно копирование - только при присваивании

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dubasua
Отправлено: 17 Ноября, 2012 - 23:39:22
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Ну вот наверное так и будет. Я просто упростил задачу для понимания, на самом деле там немного сложнее, напрямую к свойству обратиться нельзя(private), что бы его никто не смог перезаписать.
 
 Top
LIME
Отправлено: 18 Ноября, 2012 - 05:22:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




$tmp =& self:: $myVar ;
unset(self:: $myVar) ;
гоню?
(Добавление)
как вариант сделать публичную переменную tmp
 
 Top
dubasua
Отправлено: 25 Июня, 2013 - 14:43:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




И вот спустя много времени снова вернулся к этой задачке.
Только на это раз речь идет о массивах. Как вернуть значение массива по его ключю, стереть его, при этом не дублируя?
Как на счет функций array_shift() и array_pop(), только эти функции не посредственно работают с курсором массива, может есть какая нибудь похожая функция, которая будет работать с ключами а не с курсором?
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 14:45:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




PHP:
скопировать код в буфер обмена
  1. $arr = array(1,2,3,4,5,6);
  2.  
  3. $key = 2;
  4. $return = $arr[$key];
  5. unset($arr[$key]);
  6.  
  7. echo $return; // 3
  8. print_r($arr); // array(1,2,4,5,6)
 
 Top
dubasua
Отправлено: 25 Июня, 2013 - 14:48:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Да, но вопрос чтобы не дублировать значение, что бы просто return без дублирования в другую переменную.
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 14:50:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Без дублирования никак.
 
 Top
dubasua
Отправлено: 25 Июня, 2013 - 14:52:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




А как вернуть не дублируя ob_get_contents()? При этом очистить и остановить буферизацию?
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 14:54:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Пример кода сооруди.
 
 Top
dubasua
Отправлено: 25 Июня, 2013 - 14:56:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. class Page {
  3.  
  4.    public function render ( $tpl_file ){
  5.      ob_start();
  6.      include $tpl_file;
  7.      $result = ob_get_contents();
  8.      ob_end_clean();
  9.      return $result;
  10.    }
  11.  
  12. }
  13.  
  14.  
  15.  
  16.  
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Июня, 2013 - 14:57:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




И где тут массив? Нарисуй правдоподобно, пусть и нативно.
 
 Top
dubasua
Отправлено: 25 Июня, 2013 - 14:59:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Здесь без массива. Вернуть нужно ob_get_contents(), не присваивая ее переменной.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB