Новые книги

У вас есть стабильный бизнес – достаточно успешный и хорошо развивающийся, но вы почему-то до сих пор не заработали те миллионы долларов, которые планировали получить?

В чем же причина того, что вы работаете больше, а зарабатываете меньше, чем хотите? Какие секреты успешного бизнеса вы не применяете на практике? Сколько способов бесплатной рекламы вы не используете? Почему ваш бизнес не приносит вам в 5 раз больше денег, чем сейчас?

Существуют сотни приемов малобюджетного (партизанского) маркетинга, которые можно применить в вашем бизнесе. Ведь иногда достаточно внести совсем небольшие изменения, чтобы поднять свою прибыль на десятки процентов.

В результате изучения книги вы:

– узнаете, как повышать продажи даже тогда, когда у других компаний вашей отрасли они падают;

– будете знать, что и когда вам сделать для увеличения вашей прибыли;

– легко обгоните конкурентов и заберете себе их клиентов;

– перестанете терять своих клиентов и продажи, убрав «узкие места»;

– сможете продавать больше и дороже, повышая свою прибыль.

Настоятельно рекомендуется собственникам и руководителям малого и среднего бизнеса, директорам по маркетингу и развитию, руководителям отделов продаж, коммерческим и исполнительным директорам, индивидуальным предпринимателям.
Эта книга поможет быстро освоить новую версию дистрибутива Linux Fedora 8. В ней рассказывается, как установить Fedora 8 и выполнить базовую настройку системы после установки, организовать подключение к Интернету, настроить и использовать браузер Firefox, брандмауэр, загрузчик GRUB. Подробно объясняется, как установить и настроить менеджер пакетов, а также работать с ним, антивирусом, офисным пакетом ОреnOffiсе 2.3, cредствами мультимедиа и другим программным обеспечением. Обсуждается, как настроить работу видеокарты, монитора, периферийных устройств (принтера, сканера), подключить, к системе второй монитор или телевизор.

Дублирование Содержимого Переменнной: Конструктор Copy

Учебник РНР
Назад Вперёд

Глава 35. Дублирование содержимого переменной: конструктор Copy

Рано или поздно вам понадобится присвоить содержимое одного zval-контейнера другому. Это легче сказать, чем сделать, так как zval-контейнер содержит не только информацию о типе, но и ссылки на места во внутренних данных Zend. Например, в зависимости от своих размеров, массивы и объекты могут быть вложены в большое количество вхождений хэш-таблицы. Присваивая один zval другому, вы исключаете дублирование вхождений хэш-таблицы, используя только одну ссылку на неё.

Для копирования сложных видов данных используйте конструктор copy. Конструкторы сopy обычно определяются в языках, поддерживающих перегрузку операций для копирования сложных/комплексных типов. Если вы определяете объект в таком языке, у вас имеется возможность перегрузить/overloa операцию "=", которая обычно отвечает за присвоение содержимого левого значения/lvalue (результата вычисления левой части операции) правому значению/rvalue (то же самое с правой стороны).

Перегрузка означает присвоение другого значения данной операции и обычно используется для присвоения вызова функции данной операции. В любом месте программы, где эта операция используется с таким объектом, эта функция будет вызываться с lvalue и rvalue в качестве параметров. Снабжённая этой информацией, она может выполнить операцию предназначенную для операции "=" (обычно расширенную форму копирования).

Такая же форма "расширенного копирования" необходима для zval-контейнеров РНР. Итак, в случае с массивом это расширенное копирование предполагает воссоздание всех вхождений хэш-таблицы, относящихся к данному массиву. Для строк должно гарантироваться выделение соответствующей памяти, и т.д.

Zend поставляется с такой функцией, zend_copy_ctor() (предыдущим PHP-эквивалентом была pval_copy_constructor()).

Наиболее известной демонстрацией является функция, принимающая сложный тип как аргумент, модифицирующая его, а затем возвращающая аргумент:

zval *parameter;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &parameter) == FAILURE)
    return;
}

// здесь модифицируйте parameter

// теперь мы возвращаем модифицированный контейнер:
*return_value == *parameter;
zval_copy_ctor(return_value);

Первая часть функции это запрос аргумента. После (left out) модификации, однако, становится уже интересно: Контейнер для parameter присваивается контейнеру (предопределённому) return_value. Теперь, чтобы эффективно дублировать содержимое, вызывается конструктор copy. Конструктор copy работает непосредственно с предоставленным аргументом, и стандартными return-значениями являются FAILURE при неудаче и SUCCESS при успехе.

Если в этом примере опустить вызов конструктора copy, и parameter, и return_value будут указывать на одни и те же внутренние данные, что означает, что return_value будет недопустимой дополнительной ссылкой на те же самые структуры данных. Где бы ни возникли изменения в данных, на которые указывает parameter, return_value может быть изменено. Таким образом, чтобы создать разные копии, обязан использовать конструктор copy.

Компаньон конструктора copy в Zend API, деструктор zval_dtor(), выполняет противоположные конструктору действия.


Назад Оглавление Вперёд
Создание констант ВверхВозвращаемые значения