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

|===
|Это первая часть демонстрации NetBeans IDE 6.5 для PHP. В этой части рассматриваются проекты PHP и настройки выполнения.

Автор: Петр Писл (Petr Pisl)
Продолжительность: 7:45
link:http://bits.netbeans.org/media/NetBeans65PHP_demo_part_I.flv[+Загрузить+] [14 МБ]


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

* link:../../../kb/docs/php/editor-screencast.html[+Демонстрация о поддержке PHP в среде NetBeans 6.5 – Часть II: функции редактора+]
* 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.5 php demo 1 screencast[+Отправить отзыв по этому учебному курсу+]
 |   
|===
