// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Объявление переменных в комментариях и связанные функции автозавершения кода в редакторе PHP среды IDE NetBeans 6.7
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Объявление переменных в комментариях и связанные функции автозавершения кода в редакторе PHP среды IDE NetBeans 6.7 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Объявление переменных в комментариях и связанные функции автозавершения кода в редакторе PHP среды IDE NetBeans 6.7

|===
|Помимо дополнения кода конструктора и дополнения кода запроса SQL, этот демо-ролик демонстрирует метод объявления переменных PHP в комментариях. В редакторе PHP NetBeans 6.7 появились новые функции.

Автор: Джеф Рубинов (Jeff Rubinoff)
Продолжительность: 7:49
link:http://bits.netbeans.org/media/php-cc-screencast-67.mov[+Загрузить+] [19 МБ]


== Связанные ссылки

* link:../../../features/php/index.html[+IDE NetBeans для PHP+]
* link:../../../kb/trails/php.html[+ Учебная карта по PHP+]
* link:http://blogs.oracle.com/netbeansphp/[+Блог "NetBeans для PHP"+]
link:/about/contact_form.html?to=3&subject=Feedback: NB 6.7 php editor (declaring variables) screencast[+Отправить отзыв по этому учебному курсу+]
 |   
|===
