См. Документы - https://fancyapps.com/fancybox/3/docs/#usage -
[..] использовать одно и то же значение атрибута
blockquote>data-fancybox
для каждого из них создать галерею.Итак, замените
data-fancybox-group="group_=$r['reference_id'];?>"
на
data-fancybox="group_=$r['reference_id'];?>"
Нет, это не возможно, необходимо сохранить предыдущее значение перед изменением его, чтобы сделать то, что Вы просите.
Не как собственная часть языка, нет. Вы могли записать метод set, который сохранил ток (предыдущий?) оценивают, когда Строка изменяется, все же.
private String str;
private String prev;
setStr(String s)
{
prev = str;
str = s;
}
Затем просто запишите отдельный метод считывания для prev
.
Конечно, это решение полагается на Вас всегда использование метода set для изменения значения str
.
Кроме того, как deworde указывает, если для Вашей программы не нужна эта информация, то Вы не должны изменять свою программу для сохранения его. При необходимости в информации для отладки целей, можно просто установить часы в отладчике IDE.
Простой ответ, нет.
Однако Вы могли использовать:
AOP framwork, такой как AspectJ мог прервать присвоения на переменную.
Посмотрите ссылку AspectJ pointcut
Вы могли использовать стандартные методы set JavaBean, методы считывания для инкапсуляции поля. Затем можно зарегистрировать слушателей на бобе, чтобы прекратить слушать для изменений свойства и даже наложить вето на то изменение.
Посмотрите Спецификацию JavaBean для получения дополнительной информации.
Слушатель в качестве примера:
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
public class MyBeanListener implements PropertyChangeListener,
VetoableChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.printf("Notifed of property changed event: %s => %s%n", evt
.getOldValue(), evt.getNewValue());
}
@Override
public void vetoableChange(PropertyChangeEvent evt)
throws PropertyVetoException {
System.out.printf("Notified of vetoable change event: %s => %s%n", evt
.getOldValue(), evt.getNewValue());
}
}
Если у Вас действительно есть сильная необходимость в этом, Вы могли бы использовать следующий код:
public class Main
{
public static void main(final String[] argv)
{
SavedValue<Integer> i;
i = new SavedValue<Integer>();
i.set(7);
System.out.println(i.get());
System.out.println(i.getOld());
}
}
class SavedValue<T>
{
private T oldValue;
private T value;
void set(final T val)
{
oldValue = value;
value = val;
}
T get()
{
return (value);
}
T getOld()
{
return (oldValue);
}
}
Возможно, Вы могли объяснить, почему Вы хотите старое значение? Я уверен, что мы можем дать Вам намного лучшие ответы, если мы знали, почему yoiu хотел это.
Вы уже получили два простых ответа:
Но существует третий, который я не видел до сих пор:
Должно быть возможно записать Аспект в AspectJ, который включает присвоение. Таким образом, это имело бы подобный эффект как метод set без фактического метода set. Если Вы работаете с кодом, что Вы не хотите или не можете измениться, это могло бы быть опцией.
Обратите внимание, что, в то время как AspectJ не является Java, результатом является нормальный код байта, таким образом, это должно быть совместимо с большинством сред.
Конечно, вместо того, чтобы использовать AspectJ Вы могли сделать это с CGLIB.
Похоже на использование этого для отладки действительно ли я прав?
Visual Studio или любой достойный отладчик должна позволить Вам печатать трассировку значения каждый раз, когда это установило только путем помещения "точки трассировки" прежде и после всех вызовов, которые устанавливают значение.
Вы просто изменяете свойства нормальной точки останова для печати выполнения останова, а не оператора. В VS2005 это сделано:
Это обычно значительно замедляет программу при отладке, таким образом, это мало полезно для зависящей от времени отладки; но это все еще позволило мне следовать за состояниями переменной (ABCDFEGH...)
Конечно, если Вы действительно хотите остановить выполнение, просто выведите нормальную точку останова в.
Действительно, это не возможно. Необходимо было бы создать собственный Строковый класс, который имел своего рода память для достижения этого.
В дополнение к тому, что сказал Stefan, я рекомендую структуру Списка некоторого вида, содержащего все исторические ценности.
Когда Вы захотите изменить значение, просто добавьте новое значение в конец списка. Когда Вы захотите получить текущее значение, просто посмотрите на последнее значение. Если Вы хотите видеть предыдущие значения, запустите с конца списка.
Если бы Вы могли бы найти предыдущее состояние программы, никогда не было бы никакого мусора для сбора, и программа очень быстро исчерпает память.
Для определенных переменных Вы могли использовать, скажем, стек LIFO. Вместо присвоения Вы продвинули бы к стеку. Вместо того, чтобы читать переменную, Вы посмотрели бы. Содержание стека может быть исследовано для нахождения исторических ценностей.
Другой подход должен был бы использовать инструментарий. Это позволяет, Вы к, с достаточным навыком и терпением, переписываете код байта, чтобы сделать то, что когда-либо Вы хотите.
Возможно, Вы хотите отступить немного и посмотреть на то, чего Вы на самом деле пытаетесь достигнуть.
Я не знаю причины желания сделать это, но я предполагаю, что оно отлаживает некоторого вида.
При использовании затмения можно установить точки останова, которые инициировали, когда переменная изменяется. Это могло бы достигнуть того, что я предполагаю, что Вы пытаетесь добраться до.
На самом деле это возможно с помощью так называемого исторического отладчика, и это достигается за счет инструментария байт-кода, так что любое присвоение переменной записывается.
Gooogle Bil Lewis Historical Debugger для одного примера. Обратите внимание, что большая часть этого программного обеспечения находится на стадии, которую вы бы назвали «начальной бета-версией».