// 
//     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.
//

= NetBeans 6.5でのPHPサポートのデモ - パートI: プロジェクトおよび構成
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: NetBeans 6.5でのPHPサポートのデモ - パートI: プロジェクトおよび構成 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, NetBeans 6.5でのPHPサポートのデモ - パートI: プロジェクトおよび構成

|===
|これはPHP向けのNetBeans IDE 6.5のデモの最初の部分です。この部分では、PHPプロジェクトおよび実行構成について説明します。

作成者: Petr Pisl
時間: 7:45
link:http://bits.netbeans.org/media/NetBeans65PHP_demo_part_I.flv[+ダウンロード+] (14MB)


== 関連リンク

* link:../../../kb/docs/php/editor-screencast.html[+NetBeans 6.5でのPHPサポートのデモ - パートII: エディタ機能+]
* link:../../../features/php/index.html[+PHP向けのNetBeans IDE+]
* 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[+このチュートリアルに関するご意見をお寄せください+]
 |   
|===
