// 
//     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
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Поддержка пространств имен PHP в IDE NetBeans - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Поддержка пространств имен PHP в IDE NetBeans

|===
|В этой экранной демонстрации показаны функции автозавершения кода и выделения синтаксиса для пространств имен PHP 5.3 в IDE NetBeans. Также здесь продемонстрирована функция "Исправить операторы use", впервые реализованная в NetBeans 7.2. Эта функция помогает создавать операторы  ``use``  в пространствах имен. И наконец, в демонстрации показано, как изменить параметры автозавершения кода для пространств имен PHP и операторов use в PHP. Кроме того, эта экранная демонстрация содержит краткий обзор поддержки статических функций.

 

Автор: Джеф Рубинов (Jeff Rubinoff)
Продолжительность: 12:33
link:http://bits.netbeans.org/media/php-namespaces.flv[+Загрузить+] [27.4 МБ]


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

* 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: Namespace cc screencast[+Отправить отзыв по этому учебному курсу+]
 |   
|===
