آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم من با توجه به اينكه منبع های آموزش PHP به صورت پیشرفته، البته فارسی کم است، تصمیم گرفتم که یکی پیشرفته ترین مباحث PHP یعنی شیء گرایی را آمورش دهم. از شما و مدیر فاروم هم انتظار همکاری دارم. این جلسه فقط تئوری است و در جلسه ی بعد به کار عملی می پردازیم. كلاسها (Classes) يك كلاس تعريف يا نماي يك نوع خاص داده است و كلاسها به عنوان روشي براي حالت دادن به تمام انواع متفاوت اشياء و سيستم شما عمل ميكنند . هنگامي كه ميخواهيم يك شيء جديد را تعريف كنيم ، ابتدا از كلمه كليدي class براي تعريف آن ، پيش از استفاده از آن در اسكريپتهاي PHP خود استفاده ميكنيم . تفاوت واضح يك كلاس و يك شيء اين است كه كلاسها اشيايي را تعريف ميكنند كه در برنامههايمان به كار ميبريم . پيش از آن كه درباره روش ساخت يك كلاس صحبت كنيم ، ميخواهيم شروع به تأمل كنيد كه يك كلاس نمايشي از يك ايده است . مهم است كه هنگامي كه كلاسهاي خودتان را طراحي ميكنيد . آنها يك هدف را دنبال كنند و تمامي رفتاري را كه از آن ايده انتظار ميرفت را فراهم كنند . يك كلاس در PHP حاوي سه كامپوننت اصلي است : members (اعضاء) كه به آنها به عنوان داده يا صفت اشاره ميشود) متدها ، و Consructor يك عضو members تكهاي از داده است كه شيء در بر دارد . اشياء ميتوانند هر تعداد عضو داشته باشند . براي مثال ، اگر قرار باشد اتومبيل را با استفاده از يك كلاس طراحي كنيم ، يك چرخ در حال دوران يا گيربكس بايد به عنوان يك عضو از ماشين تعريف شوند . متدها سرويسهايي هستند كه شيء براي سرويس گيرندههايش فراهم ميكند كه از اعضا داخلي آن استفاده ميكنند و آنها را دستكاري ميكنند . براي مثال ، اگر قرار باشد اتومبيل را با استفاده از يك كلاس طراحي كنيم ، يك چرخ در حال دوران يا گيربكس بايد به عنوان يك عضو از ماشين تعريف شوند . متدها سرويسهايي هستند كه شيء براي سرويس گيرندههايش فراهم ميكند كه از اعضا داخلي آن استفاده ميكنند و آنها را دستكاري ميكنند . براي مثال ، يك كلاس car ميتواند يك متد را براي روشن كردن وسيله نقله و استفاده از چرخ در حال دوران در داخل آن فراهم كند . يك Constructor متد خاصي است كه شيء را درون وضعيت آماده آن معرفي مي:ند . تنها يك Constructor براي يك شيء در PHP ميتواند موجود باشد . در يك كلاس car ، افزودن بدنه ، موتور ، لاستيكها ، گيربكس ، صندلي و غيره بر روي car با هم متفاوتند . هنگامي كه سرويس گيرندهها ميخواهند از متدهاي روي يك شيء استفاده كنند ، Constructor اطمينان ميدهد كه هر متد عمليات را با موفقيت به انجام خواهد رساند و نتيجه مورد انتظار را برخواهد گرداند . براي مثال ، براي روشن كردن راديو درون اتومبيل شما ، بايد يك راديو نصب شده باشد . در اين نمونه ، Constructor مسئول اطمينان بخشيدن از اين موضوع است كه راديو پيش از استفاده نصب شده است. به غير از مقدار دهي شيء به يك وضعيت آماده معتبر ، تفاوت اساسي ديگر اين است كه يك Constructor هيچ مقدار برگشتي صريحي ندارد . تمامي Constructor ها يك متغير جديداً اختصاص يافته را براي استفاده در برنامه شما بر ميگردانند . در نتيجه ، برگرداندن يك مقدار در Constructor كلاس ، غيرقانوني است . درباره استفاده از اشياء در برنامههاي شما ، در بخش بعدي بيشتر صحبت خواهيم كرد . اطمينان يافتن از طراحي مناسب اشياء و Constructor هاي آنها ، مسئلهاي است كه توسعه دهندگان زيادي اغلب با آن روبرو ميشوند . هنگامي كه كلاس برنامهنويسان را وادار ميكند كه اعضاي شيء را پيش از استفاده از متدهاي خود تنظيم كنند يا هنگامي كه كلاس برنامهنويس را وادار ميكند تا از ترتيب خاصي ، هنگام فراخواني متدهاي شيء پيروي كند ، كد گيج كننده و مبهمي را ايجاد ميكند . از OPP به اين منظور استفاده ميكنيم كه به طور كلي از بروز چنين مسئلهاي جلوگيري كنيم . اگر كلاس مهندسي شده است تا از Constructor هاي خود براي معرفي بخشهاي كليدي كلاس استفاده نكند ، اشكال از طراحي ضعيف ناشي ميگردد . دوباره در همان تله گرفتار نشويد . كلاسي كه خوب طراحي شده باشد برنامهنويسي ، اشكالزدايي و نگهداري زيادي را حذف ميكند . بياييد نگاهي به دستور زبان كلي براي Class در PHP بيندازيم ، كه استفاده از اين سه نوع كامپوننت را نشان ميدهد : PHP Code: <code style="white-space: nowrap;"> <code> class ClassName [extends ParentclassName] { var $member1; var $member2; … var $memberN; // Constructor function Class Name() { } function method1() { } … function method2() { } function methodN() { } } </code> </code> همانگونه كه ميبينيد ، يك كلاس چيزي نيست جز يك مجموعه از اعضاي تعريف شده (متغيرها) و متدها (توابع) . اعضا ميتوانند يا انواع داده اوليه نظير integer ها و رشتهها يا انواع پيچيدهتري نظير آرايهها يا اشياء ديگر باشند . از آنجايي كه PHP از شما انتظار ندارد كه انواع را تعريف كنيد ، فقط ميتوانيد متغيرهايتان را در بالاي كلاس ، به صورتي كه در بالا نشان داده شد ، نام ببريد . با PHP ميتوانيد متغيرهايي را در تابع خود ايجاد كنيد ؛ آنها به همان خوبي كه مورد انتظارتان است كا رخواهند كرد . اگرچه ، تمرين خوبي نخواهد بود اگر اين كار را انجام دهيد . اين به آن خاطر است كه وقتي برنامهنويسان ديگر به كلاس شما نگاه ميكنند ، فوراً تمامي اعضاي آن را پيش از نگاه كردن به پيادهسازي توابع بشناسند . متدها به سادگي تمام سرويسهايي هستند كه اين كلاس تضمين ميكند تا براي سرويس گيرندههايش فراهم كند . سرويس گيرندهها ميتوانند برنامههاي ديگر ، پروژههاي ديگر و غيره باشند
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم قسمته دوم. در این قسمت به ساخت یک کلاس بسیار ساده می پردازیم همچنین بیشتر در مورد شیء ها صحبت خواهیم کرد. بياييد كد يك كلاس Car را ايجاد كنيم . در اين مثال شروع به تعريف كلاس خود ميكنيم . اين كار را با استفاده از كلمه كليدي Class در خط دوم ميكنيم . تمرين مهندسي نرمافزار خوبي است تا حرف اول تمامي نامهاي كلاسها را براي تشخيص آنها از متغيرها يا توابع با حروف بزرگ بنويسيم . برنامهنويسان اين كار را براي سالها در زبانهاي گوناگون ديگر انجام دادهاند . شناسايي Constructor در ميان متدهاي متنوع ديگر در كلاس ساده است . همچنين عادت خوبي است كه نام فايلهايتان را با نام كلاس نامگذاري كنيد . نظير Car.php يك فايل تنها بايد شامل يك كلاس باشد . اگر چند كلاس داريد كه به يكديگر مرتبط هستند ، نظير مجموعه كلاسهاي انواع داده اصلي ، بايد آنها را درون يك زيرادايركتوري تحت برنامه كاربردي اصلي خود قرار دهيد . اگر روي يك پروژه عظيم كار ميكنيد ، اين تمرين ضروري است . با بزرگتر شدن سيستمها ، ضروري خواهد بود كه از يك ساختار دايركتوري درخت مانند ، براي نگهداري تمامي كلاسهايي كه در برنامه كاربردي وب شما بكار ميروند ، استفاده كنيد . شما بايد از include_once() يا require_once() براي اضافه كردن كلاسها به فايلهاي سورس خود در هنگام نياز به آنها استفاده كنيد . PHP Code: <code style="white-space: nowrap;"> <code> <? Php // Car.php class Car { </code> </code> در يك مدل بينهايت ساده از يك اتومبيل ، كلاس شامل موتور و نمايش كليدي براي روشن كردن اتومبيل است . يك اتومبيل واقعي بايد يك بدنه ، يك پدال گاز و يك ترمز و يك چرخ ، گيربكس و غيره داشته باشد ، اما اين تنها براي نمايش است : PHP Code: <code style="white-space: nowrap;"> <code> var $engine ; var $requiredkey; </code> </code> اتومبيل ما همچنين يك constructor دارد كه موتور آن را تنظيم ميكند و كليدي دارد كه اتومبيل را روشن ميكند . اگر اين عناصر اتومبيل را شناسايي نميكرديم ، هر فراخواني start() و stop() از كار ميايستاد و خطاهايي را بر ميگرداند . چنانكه قبلاً ذكر كرديم ، وظيفه constructor شناسايي تمامي عناصر شيء ، جهت كسب اطمينان از امكان استفاده از تمامي سرويسها در هنگام نياز است . توجه داشتهباشيد كه اگر ميخواهيد به يك عضو كلاس رجوع كنيد ، بايد يك كلمه كليدي $this-> را در ابتداي نام عضو قرار دهيد . اين ارتباط از جاوا يا C++ متفاوت است كه در آنها اختياري است . اين بدليل كارايي ضعيف PHP ، سه سطح namespace وجود دارند كه متغيرها در آن مرتب ميشوند . (يك namespace اصولاً مجموعهاي از نام متغيرها است). پايينترين سط ح namespace براي متغيرهاي محلي درون توابع يا متدها بكار ميرود . هر متغير ايجاد شده در اين سطح به namespace محلي اضافه شده است . namespace بعدي حاوي تمامي اعضاي يك شيء است . بالاترين سطح namespace براي متغيرهاي عمومي بكار ميرود . كلمهه كليدي $this به PHP ميگويد كه متغير را از namespace شيء ميخواهيد (سطح وسط) . اگر فراموش كنيد كه كلمه كليدي $this را لحاظ كنيد ، يك متغير كاملاً جديد را در namespace محلي ايجاد خواهيد كرد . از آنجايي كه اين به يك متغير كاملاً متفاوت از آنچه كه قرار بود رجوع ميكند ، چند خطاي منطقي كه اشكال زدايي آنها دشوار است را خواهيد داشت . اطمينان پيدا نمايد كه گزارش خطا را فعال ميكنيد ، كه در فصل بعدي مورد بحث قرار گرفته است ، و چند assertion را براي محافظت از اين خطاي رايج در هنگام توسعه كلاسهايتان اضافه كنيد . متد start() اتومبيل را با استفاده از key براي كاربر روشن خواهد كرد . اگر key صحيح باشد ، آبجكت اتومبيل به موتور خواهد گفت تا شروع به كار كند : PHP Code: <code style="white-space: nowrap;"> <code> // Constructor function Car() { $this-> requiredkey(); $this->engine= new Engine() ; } function start ($Key) { if ($key->equals($this->requiredKey)) { $this->engine->start(); return true ; } return false ; } </code> </code> متد stop() ساختاري مشابه متد start() دارد . اين متد بررسي ميكند تا ببيند آيا موتور روشن است يا خير ، و اگر روشن باشد ، اتومبيل را متوقف خواهد كرد . توجه كنيد كه چك كردن موتور براي اطمينان از روشن بودن آن ميتوانست در تابع stop() آبجكت engine صورت گيرد ، تا ما راحتي از فكر كردن درباره آن باز دارد . از خودتان سؤال خواهيد كرد كه منطق(logic) در كجا بكار خواهد رفت . اين ، پايههاي توسعه معماري خوب و موفق است : PHP Code: <code style="white-space: nowrap;"> <code> function stop () { if ($this->engine->isRunning()) { $this->engine->stop() ; } } // … Several other methods such as moving and turning , and so on . } ?> </code> </code> حال اجازه دهيد ببينيم كه چگونه ميتوانيم از اين آبجكت در برنامههايمان استفاده كنيم . آبجكتها (Objects) يك شيء در برنامهها نمونهاي از يك كلاس است . دليل اين كه يك نمونه خوانده ميشود اين است كه ميتوانيم چندين شيء را ايجاد كنيم (يا نمونههايي) كه از يك كلاس باشند . همانطور كه اتومبيلهاي متعددي از يك كلاس ميتوانند در جادهها باشند براي ايجاد دو اتومبيل جديد ، تمام آن چيزي كه نياز خواهيم داشت ، اجراي اين خطوط كد در برنامه ما است : PHP Code: <code style="white-space: nowrap;"> <code> <? Php $car1=new Car(); $car2=new Car(); </code> </code> از كلمه كليدي new براي ساخت نمونه جديدي از كلاس استفاده ميكنيم ، كه ايجاد يك شيء جديد است . هنگامي كه شيء يا يك نمونه كلاس را ايجاد ميكنيم ، ميگوييم كه شيء براي اولين بار نمونهسازي (instantiate) شده است . مرجع شيء تازه نمونهسازي شده به ترتيب درون متغيرهاي $car1 و $car2 قرار ميگيرد . حال دو شيء داريم كه براي استفاده در دسترس هستند . اگر ميخواستيم ده اتومبيل ايجاد كنيم ، از آرايهاي از اشياء مانند اين استفاده ميكرديم : PHP Code: <code style="white-space: nowrap;"> <code> $cars = array() ; for($I=0;$I<10;$I++) { $cars[$I]=new Car (); } </code> </code> اگر بخواهيم يك اتومبيل را روشن كنيم ، متد start() آن را به صورت زير فراخواني مينماييم : PHP Code: <code style="white-space: nowrap;"> <code> $carHasStarted = $car1->start($myKey); if ($carHasStarted) echo(“Car has started.”); </code> </code> و اگر خواستيم اتومبيل را متوقف كنيم ، به صورت زير عمل مينماييم : PHP Code: <code style="white-space: nowrap;"> <code> $car1->stop(); ?> </code> </code> متوجه شديد كه اين شيء داراي يك واسط ساده براي استفاده است . شما مجبور نيستيد بدانيد كه واسط چگونه توسعه يافته است . به عنوان يك برنامهنويس ، تنها چيزي كه بايد بدانيد ، سرويسهايي هستند كه توسط يك شيء فراهم ميگردند . اين برنامه ميتوانست به خوبي يك اتومبيل فيزيكي را براي روشن شدن و متوقف شدن بسازد ، اما پيچيدگي اين متدها و جزئيات اعضاي آن به كلي ناشناخته هستند . اين ايده ايجاد اشياء قابل استفاده به آساني ، ما را به بخش بعدي هدايت مي :ند كه Encapsulation (كپسوله سازي) نام دارد .
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم قسمت سومش متدهاي كارخانه گاهي بهتر است از يك شيء بخواهيد تا يك شيء جديد را براي شما ايجاد كند تا اين كه خودتان اپراتور جديدي را صدا بزنيد . اين كلاسها ، كارخانه (factory) نام ميگيرند و متدهايي كه اين اشياء را ايجاد ميكنند ، متدهاي كارخانه نام دارند . كلمه كارخانه ، ريشه در استعارهاي از سهولت توليد دارد . براي مثال ، يك كارخانه موتورسازي كه مالك آن جنرال موتور است و توليدكننده موتورهاي اتومبيل است ، بسيار شبيه به يك كارخانه شيء است كه اشيايي از نوع خاص را توليد ميكند . بدون تعميق در جزئيات مدلهاي آبجكتي پيچيده ، بياييد ببينيم چگونه ميتوانيم از كارخانههاي شيء در برخي قسمتهاي توسعه برنامه كاربردي وب استفاده كنيم . در اينجا چند مثال داريم : • ممكن است بخواهيد يك Form Control Factory را ايجاد كنيد كه عناصر فرمي متنوعي را ايجاد ميكند (نظير فيلدهاي متني ، گروههاي راديويي ، دكمههاي submit و غيره) تا روي يك فرم HTML نظير آن چه كه در كتابخانه eXtreme PHP پيادهسازي شده است • ممكن است بخواهيد يك كارخانه را براي واردن كردن سطرهاي جديد به داخل جدول پايگاه داده و بازگرداندن آبجكت دسترسي داده مناسب براي آن سطر خاص ، ايجاد كنيد . حال بايد ببينيم چگونه ميتوان يك كلاس كارخانه و متدهاي مربوط به آن را با ايجاد TextField و آبجكتهايSubmitButton )از (Extreme PHP درون كلاس Form Control Factory ايجاد كرد . در اينجا دو فايل را وارد ميكنيم كه در نظر ميگيريم از پيش ساخته شدهاند . فايل TextField.php حاوي كد مربوط به كلاس TextField و SubmitButton.php حاوي كد مربوط به كلاس SubmitButton است . چنانكه خواهيد ديد ، اين دو فايل نيازمند يك نام و يك مقدار براي انتقال به Constructor هاي خود ، هنگام ايجاد نمونههاي جديد هستند : PHP Code: <code style="white-space: nowrap;"> <code> <?php include_once(“./Text Field.php”); include_once(“./SubmitButton.php”); </code> </code> هنگام توسعه كلاسهاي كارخانه ، تمرين خوبي خواهد بود اگر كلمه “Factory” را به انتهاي نام كلاس اضافه كنيد كلمه “Factory”تبديل به يك قرارداد مشترك در دنياي شيء گرايي شده است و به برنامهنويسان ديگر كمك خواهد كرد تا از اين واژه شناسي مشترك تشخيص دهند كه كلاس چه كاري را انجام ميدهد : PHP Code: <code style="white-space: nowrap;"> <code> // FormControl Factory.php class FormControlFactory { </code> </code> اين اولين متد كارخانه ما ، يعني createTextField() ميباشد و به سادگي يك نمونه جديد از كلاس TextField را با انتقال $name و $value تأمين شده توسط سرويس گيرنده ، ايجاد ميكند : PHP Code: <code style="white-space: nowrap;"> <code> function createTextField($name,$value) { return new TextField($name,$value) ; } </code> </code> متد createSubmitButton() به همان روش تعريف شده است . همچنين يك قرارداد مشترك براي اتصال كلمه “create” به ابتداي متد كارخانه براي مشخص كردن شيء جديدي است كه بر ميگرداند . اين يك واژه سازي مشترك را در برنامه كاربردي شما ايجاد خواهد كرد و فهم كد شما و سطح قابل رديابي شدن (traceability) آن را افزايش خواهد داد : PHP Code: <code style="white-space: nowrap;"> <code> function createSubmitButton($name,$value) { return new SubmitButton ($name,$value) ; } } </code> </code> حال بتجاي اين كه آبجكتهاي TextField و SubmitButton را با استفاده از اپراتور جديد براي اولين مرتبه معرفي كنيم ، ميتوانيم از Form Control Factory براي انجام اين كار استفاده كنيم : PHP Code: <code style="white-space: nowrap;"> <code> $ Form Control Factory =new Form Control Factory(); $firstNameFild= $ Form Control Factory -> createTextField(‘firstname’, ‘Ken’); $lastNameFild= $ Form Control Factory -> createTextField(‘lastname’, ‘Egervai’); $ SubmitButton= $ Form Control Factory -> create SubmitButton(‘submit’, ‘Submit Name’); ?> </code> </code> در اينجا نمونه جديدي از Form Control Factory را ايجاد ميكنيم و سه كلاس جديد را با استفاده از متدهاي كارخانه آن ايجاد ميكنيم . دو فراخواني اول () createTextField ، فيلدهاي متني را ايجاد ميكند كه يك نام و نامخانوادگي را ذخيره ميكنند . فراخواني بعدي يك دكمه submit با عنوان “Submit Name" را ايجاد ميكند در اين نقطه ، برنامه كاربردي ما ميتواند هركاري كه نياز دارد با اين آبجكتهاي جديد انجام دهد . اهميت در معني برنامه كاربردي نيست ، بلكه در ساختار و مفهوم آن چه كه متدهاي كارخانه هستند و چگونگي استفاده از آنها در برنامههاي وب نهفته است . كلاسهاي كارخانه تنها محدود به ايجاد متدها نيستند . شما ميتوانيد متدهاي ديگري را اضافه كنيد كه با مدل كارخانه نزديك ميباشند نظير متدهاي find كه به دنبال آبجكتهاي كارخانه ميگردند و آنها را باز ميگردانند و متدهايي را حذف ميكنند كه ميتوانند آبجكتهايي را در كارخانه اوراق كنند. اين پيادهسازيها به پروژه مربوط ميشوند و برعهده شما به عنوان طراح برنامه كاربردي هستند. حال بياييد توجه خود را به اصول encapsulation و پنهانسازي اطلاعات معطوف كنيم
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم ادامه قسمت سوم Encapsulation (كپسولهسازي) هنگامي كه مسكن سردرد خود را مصرف ميكنيد ، احتمالاً از محتويات آن آگاه نيستيد . تمام آنچه كه مد نظر شماست ، توانايي آن در برطرف كردن سردرد شماست . اين مسئله زماني صادق است كه برنامهنويسان از آبجكتهاي ارائه شده براي آنها استفاده ميكنند . هنگامي كه به استفاده از آبجكت Car خود پرداختيم ، چيزي درباره گيربكس ، سيستم اگزوز يا موتور وسيله نقليه نميدانستيم . تمام آن چه كه لازم داشتيم ، پيچاندن كليد و روشن كردن اتومبيل بود . هنگام طراحي آبجكتها هدف همين خواهد بود . تمامي دادههاي مركب و منطق را درون آبجكت جمع كنيد و براي كاربران تنها سرويسهاي معنيداري را كه آنها انتظار دارند با آبجكت به تعامل بپردازند را فراهم نماييد . در اينجا كپسوله نمودن داده مركب و جزئيات منطقي درون آبجكت را ميبينيم . اگر اين كار به صورت مناسب انجام گيرد ، فايده مخفي كردن اطلاعات را خواهيم ديد ، كه بعداً مورد بررسي قرار خواهد گرفت . چنانكه پيشتر ذكر كرديم ، براي كاربران كلاس اهميت دارد تا از اعضاي دادهاي درون كلاس كاملاً بياطلاع باشند . اگرچه اين مسئله در PHP كاملاً معتبر است ، كه اعضاي آبجكتي كه براي اولين بار نمونهسازي شده است را در هر زماني تغيير دهيم ، اما انجام اين كار به عنوان يك عادت بد در نظر گرفته ميشود . در اينجا مثالي داريم كه چند رويداد ناگوار را نشان ميدهد كه در صورتي كه اعضاي آبجكت را بدون رفتن به واسط آبجكت تغيير دهيم ، اتفاق خواهند افتاد . در اين مثال در نظر ميگيريم كه متدي براي تنظيم سرعت اتومبيل وجود دارد كه نام آن setSpeed است است ($speed) ، كه در صورتي كه آن را روي بيش از 200km/h تنظيم كنيد و يا وقتي سرعت كمتر از 0km/h باشد با شكست مواجه خواهد شد . همچنيني بايد تصور كنيم كهconstructor (سازنده) ماكليد و موتور را براي روشن كردن اتومبيل شناسايي نميكند : $ PHP Code: <code style="white-space: nowrap;"> <code> myKey =new Key(‘Key of my Porsche’); $car = new Car(); $car->engine = new Engine(); $car->speed=400; $car->start($myKey); $car->engine =0; $car->stop(); </code> </code> خطاهاي زيادي در اين كد وجود دارند كه يا در تفسير دچار مشكل خواهند شد و يا حتي بدتر ، كارخواهند كرد ، اما در رفتار مناسب با شكست مواجه خواهند شد . در سه خط اول ، در تنظيم عضو $requiredkey آبجكت $car خود شكست خورديم ، چرا كه اين كار توسط constructorما انجام نشده بود . كليد لازم نخواهد بود ، مگر اين كه بخواهيم واقعاً اتومبيل را روشن كنيم ، پس هيچ خطايي از اين جا نتيجه نميشود . پس همه چيز پس از چند خط اول خوب به نظر ميرسد . به طور جداگانه نگاهي به خطي مياندازيم كه آبجكت Engine را ساختيم . اگر به جاي آن مينوشتيم : $car->Engine=new Engine() چه ميشد ؟ (“E” بزرگ را در كلمه Engine مورد توجه قرار دهيد.) اتومبيل از روشن شدن باز ميايستاد ، زيرا موتور نيز شناسايي نميشد . حتماً خواهيد توانست اين اشكالات را به آساني برطرف كنيد ، اما آنها نبايد در اولين وهله رخ دهند . سپس سعي ميكنيم اتومبيل را روشن كنيم : PHP Code: <code style="white-space: nowrap;"> <code> $car->speed=400;//should have been $car ->setSpeed(400); to cause // a failure $car->start($myKey); </code> </code> هنگامي كه اتومبيل روشن ميشود به جلو رانده ميشود و سرعتش به 400km/h خواهد رسيد . اين ميتواند باعث تصادف و كشته شدن مردم در جاده (يا خارج از آن) شود . اين يقيناً آن چيزي نخواهد بود كه ما ميخواهيم . اتومبيل از كجا ميداند كه به چه كليدي براي روشن كردن اتومبيل نياز دارد ؟ بايد كليد ساخته شده را با متغيري كه حتي وجود ندارد مقايسه كند (و نتيجهاي برابر 0 در برداشته باشد) و در نهايت در روشن كردن اتومبيل با شكست مواجه خواهد شد . مقايسهاي نظير اين مستقيماً به چك كردن مفسر مربوط ميشود ، چرا كه $key ورودي است كه برابري را چك ميكند و نه عضو را . براي مالك اتومبيل خجالتآور خواهد بود اگر كه يك وسيله نقليه جديد بخرد و تازه بفهمد كه كليد ارائه شده توسط فروشنده هرگز كار نكرده است . بياييد ببينيم كه چه اتفاقي خواهد افتاد اگر بخواهيم هنگامي كه engine را روي 0 تنظيم كردهايم ، اتومبيل را خاموش كنيم : PHP Code: <code style="white-space: nowrap;"> <code> $car->engine=0 $car->stop(); </code> </code> هنگامي كه متد stop() فراخوانده ميشود . با يك خطاي زمان اجرا مواجه خواهيم شد ، چرا كه آبجكت Engine با اينكه حتي وجود ندارد ، آن را وادار به پذيرفتن مقدار integer كردهايم . چنانكه ميبينيد ، تنظيم اعضا از خارج كلاس احتمالاً ميتوانست مشكلات فراواني را به بار بياورد . در دنيايي كه چندين برنامهنويس را در حال كاركردن بر روي يك پروژه داريد ، بايد انتظار داشته باشيد كه بقيه بتوانند كد شما را بخوانند و احتمالاً از آن استفاده كنند . چه درسهايي از اين مثال آموختيم ؟ استفاده از اعضا در خارج از آبجكت (object violations) ميتواند : • عدم اطمينان از اينكه سرويسهايي كه به وسيله آبجكت فراهم شدهاند ، به گونهاي كه از آنها انتظار داريم رفتار نمايند . • عدم جامعيت (integrity) اعضاي داده آبجكت (يا وضعيت آبجكت) در يكي از دو روش زير : • تخطي از تعيين وضعيت ابتدايي اعضاء • ايجاد واسطهايي پيچيدهتري نسبت به آن چه كه شما واقعاً نياز داريد . • مسئوليت سنگينتري روي دوش برنامهنويسان بگذارد تا بيشت درباره آبجكت و روشي كه داده با سرويسها كار ميكند ، فكر كنند . • هنگامي كه زمان استفاده مجدد از آبجكت فرا ميرسد ، ممكن است مجبور باشيد اعضا را مجدداً تغيير دهيد . گاهي به غير از فراموشكاري ، خطاهاي جديدي در پروژه بعدي ايجاد خواهيد كرد . اين دقيقاً چيزي است كه ميخواهيم از آن دوري گزينيم . طراحي كلاس بگونهاي كه براي انجام هر آن چه كه ميخواهيد با آبجكت انجام دهيد مناسب باشد ، راه عملي خوبي خواهد بود . هرگز به اعضاي خارج از كلاس دستيابي پيدا نكنيد و هميشه كلاسهاي خود را به طور مناسب در كپسول قرار دهيد ، تا فوائد مخفي كردن اطلاعات را حاصل كنيد . برخي زبانها قابليت غير مجاز ساختن دسترسي به اعضا را به طور كلي و بوسيله خصوصي ساختن (يا محافظت كردن) آنها تنها براي كلاس ارائه ميدهند . در حال حاضر PHP از اين امكان بهرهمند نيست ، اما پيروي از عادتهاي خوب كدنويسي ، بدون شك مفيد خواهد بود .
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم آموزش php - قسمت چهارم - حلقه ها حلقه ها و .... در درسهای قبلی همواره کدها در یک جهت حرکت می کردند. در واقع خط به خط کدهای ما اجرا می شد و جلو می رفت. این روش جایی برای کدنویسی منعطف نمی گذارد. در این درس می خوانیم : چگونه یک کد را وقتی اجرا کنیم که یک عبارت True باشد. IF CLAUSE چگونه قسمت دیگری از کد اجرا شود وقتی که همان عبارت False شود. ELSE چگونه از دستور switch استفاده کنیم. چگونه یک قسمت از کد را چند مربطه اجرا کنیم . while چگونه از FOR برای اجرای حلقه استفاده کنیم. چگونه یک حلقه FOR را قطع کنیم. اغلب script ها نیاز به تغییر خروجی در شرایط مختلف دارند. با استفاده از IF شما می توانید خروجی کدهای خودتون را در php با توجه به یک سری شرایط تغییر دهید. IF IF عبارت داخل پرانتز جلوی خود را کنترل می کند و درصورتی که Trueباشد آن قسمت از کد را اجر می نماید. PHP Code: <code style="white-space: nowrap;"> <code> if ( expression ) { // code to execute if the expression evaluates to true } </code> </code> فرمت کلی IF به صورت بالا است. expression عبارتی است که باید کنترل شود. و عبارات بین { و } کدی است که در صورت true بودن عبارت If باید اجرا شود. PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.1</title> 4: </head> 5: <body> 6: <?php 7: $mood = "happy"; 8: if ( $mood == "happy" ) 9: { 10: print "Hooray, I'm in a good mood"; 11: } 12: ?> 13: </body> 14: </html> </code> </code> در خط 8 کد بالا ما از == استفاده کردیم تا کنترل کنیم که mood مقدار happy را در خود دارد یا خبر. از { و } فقط وقتی استفاده می کنیم که کدهای ما بیشتر از یک خط باشند. کد بالا رو به صورت زیر نیز می توان نوشت : PHP Code: <code style="white-space: nowrap;"> <code> if ( $mood == "happy" ) print "Hooray, I'm in a good mood"; </code> </code> در این حالت Hooray, I'm in a good mood چاپ می شود. اگر ما متغیر mood رو "sad" قرار دهیم دیگر چیزی چاپ نخواهد شد. استفاده از ELSE در IF فرمت کلی آن به صورت زیر است : PHP Code: <code style="white-space: nowrap;"> <code> if ( expression ) { // code to execute if the expression evaluates to true } else { // code to execute in all other cases } </code> </code> قسمت بعد از else فقط وقتی اجرا می شود که عبارت داخل if ، برابر False باشد. PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.2</title> 4: </head> 5: <body> 6: <?php 7: $mood = "sad"; 8: if ( $mood == "happy" ) 9: { 10: print "Hooray, I'm in a good mood"; 11: } 12: else 13: { 14: print "Not happy but $mood"; 15: } 16: ?> 17: </body> 18: </html> </code> </code> در مثال بالا متغیر mood مقدار "sad" دارد و در واقع با "happy" برابر نیست پس قسمت داخل IF اجرا نمی شود و فقط قسمتی که داخل else می باشد اجرا خواهد شد. خروجی دستور بالا به صورت Code: Not happy but sad</pre> خواهد بود. استفاده از ElseIf ElseIf مجددا یک عبارت دیگر را اجرا می نماید و در صورت True بودن دستورات داخلش اجرا خواهد شد. فرمت کلی به صورت زیر است : PHP Code: <code style="white-space: nowrap;"> <code> if ( expression ) { // code to execute if the expression evaluates to true } elseif ( another expression ) { // code to execute if the previous expression failed // and this one evaluates to true else { // code to execute in all other cases } </code> </code> اگر عبارت IF درست نباشد تکه اول کد نادیده گرفته می شود و نوبت عبارت Esleif می رسد اگر این عبارت درست باشد قسمت دوم کدها اجرا می شود. دستور else در نهایت وقتی اجرا می شود که هیچ کدام از عبارات IF و Elseif درست نباشند. شما به هر تعداد که می خواهید می توانید esleif در کدتان بگذارید. و در نهایت Else دلخواه است و می تواند در کد وجود نداشته باشد. PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.3</title> 4: </head> 5: <body> 6: <?php 7: $mood = "sad"; 8: if ( $mood == "happy" ) 9: { 10: print "Hooray, I'm in a good mood"; 11: } 12: elseif ( $mood == "sad" ) 13: { 14: print "Awww. Don't be down!"; 15: } 16: else 17: { 18: print "Neither happy nor sad but $mood"; 19: } 20: ?> 21: </body> 22: </html> </code> </code> در مثال بالا mood مقدار sad دارد. این مقدار با Happy برابر نیست پس قسمت اول کدها نادیده گرفته می شود. Elseif متغیر mood را با مقدار sad مقایسه می کند که True است و کدهای قسمت دوم اجرا می شوند. دستور Switch این دستور روش دیگری برای تغییر مسیر حرکت اجرا شدن کدهاست. دستور switch فقط یک عبارت رو چک می کند و می تواند این عبارت را با مقادیر متفاوتی مقایسه کند و فقط کدی را اجرا کند که مقدار مورد نظر در آن True شود. فرمت کلی به صورت زیر است : PHP Code: <code style="white-space: nowrap;"> <code> switch ( expression ) { case result1: // execute this if expression results in result1 break; case result2: // execute this if expression results in result2 break; default: // execute this if no break statement // has been encountered hitherto } </code> </code> عبارت داخل دستور switch (منظور همان expression داخل پرانتز جلوی آن است) معمولا یک متغیر است. در کد های داخل switch (منظور قسمت بین { و } می باشد) شما case های مختلفی را می بینید که مقدار متغیر switch با همه این case ها مقایسه می شود و وقتی که مقدار ها با هم برابر بود کد مربوطه اجرا می شود. گذاشتن قسمت default اختیاری است. در صورتی که متغیر با هیچ کدام از مقادیر caseها برابر نباشد ، دستورات داخل default اجرا خواهد شد. احتیاط : دقت کنید که کلمه break در انتهای هر case را حتما بگذارید. در غیر اینصورت کد بعد از اجرا کردن case مورد نظر به راه خود ادامه می دهد و به مقدار default می رسد و آن را نیز اجرا می کند و این در اکثر مواقع چیزی نیست که ما دنبالش باشیم. دستور break در واقع از کل کدهای case خارج شده و به انتهای دستور switch می رود. مثال : PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.4</title> 4: </head> 5: <body> 6: <?php 7: $mood = "sad"; 8: switch ( $mood ) 9: { 10: case "happy": 11: print "Hooray, I'm in a good mood"; 12: break; 13: case "sad": 14: print "Awww. Don't be down!"; 15: break; 16: default: 17: print "Neither happy nor sad but $mood"; 18: } 19: ?> 20: </body> 21: </html> </code> </code> در مثال بالا ، در ابتدا mood مقدار sad را دارد و وقتی که در خط 8 Php وارد switch می شود ابتدا mood را با happy مقایسه می کند (خط 10) و به دلیل اینکه True نمی شود به خط 13 می رود در آنجا چون mood=sad است کد خط 11 و سپس خط 12 را اجرا می کند. در خط 12 با دیدن دستور break به خط 18 می رود. روش جالب عملگر شرطی علامت سوال (؟) من اسم این روش رو IF یک خطی گذاشتم ! در این روش شما بدون نیاز به نوشتن دستورات IF می توانید تابع شرطی ایجاد کنید که در آن عبارتی چک شود و در صورت درست بودن یک سری کد اجرا شود و در صورت اشتباه بودن کد دیگر. PHP Code: <code style="white-space: nowrap;"> <code> ( expression )?returned_if_expression_is_true:returned_if_expression_is _false; </code> </code> اگر عبارت داخل پرانتز ما True بود کد بعد از علامت سوال اجرا می شود و در غیر اینصورت کد بعد از : اجرا خواهد شد. PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.5</title> 4: </head> 5: <body> 6: <?php 7: $mood = "sad"; 8: $text = ( $mood=="happy" )?"Hooray, I'm in a good mood":"Not happy but $mood"; 9: print "$text"; 10: ?> 11: </body> 12: </html> </code> </code> در مثال بالا در خط 8 از این روش استفاده شده است. در اینجا متغیر moodبا مقدار happy مقایسه می شود اگر درست بود خواهد نوشتHooray, Im in good mood و در غیر اینصورت (که اینجا اینطور نیست) می نویسد Not Happy But $mood که چون اینجا $mood مقدار Sad دارد خروجی می شود Not Happy But Sad. نوشتن و خواندن کد اینطوری کمی سخت است ولی اگر شما فقط یک شرایط رو بخواهید چک کنید و علاقه به نوشتن کدهای فشرده دارید این روش بسیار خوبی است. حلقه ها تا به حال روشهایی را دیدید که به وسیله آن کد می تواند بین اینکه کدام کد را اجرا کند انتخاب داشته باشد. همچنین کد می تواند تصمیم بگیرد که چند دفعه یک قسمت را اجرا کند. حلقه های برای این ایجاد شده اند که به شما اجازه دهند یک عملیات را چند مرتبه اجرا نمایید. تقریبا بدون استثناء ، همه حلقه ها آنقدر اجرا می شوند تا اینکه یک شرایطی (که از توسط شما مشخص می شود) اتفاق بیافتد و یا اینکه شما شخصا دستور قطع و خروج از loop را بدهید. while PHP Code: <code style="white-space: nowrap;"> <code> while ( expression ) { // do something } </code> </code> تا وقتی که عبارت while (منظور همان expression داخل پرانتز جلوی آن است) True باشد کد داخل while پشت سر هم اجرا می شود. معمولا شما در داخل حلقه کاری می کنید که عبارت مرتبا تغییر نماید و یک جا False شود در غیر اینصورت حلقه شما تا بینهایت اجرا می شود. مثال زیر حلقه ای ایجاد می کند و مضارب 2 را نمایش می دهد. PHP Code: <code style="white-space: nowrap;"> <code> Listing 5.6: A while Statement 1: <html> 2: <head> 3: <title>Listing 5.6</title> 4: </head> 5: <body> 6: <?php 7: $counter = 1; 8: while ( $counter <= 12 ) 9: { 10: print "$counter times 2 is ".($counter*2)."<br>"; 11: $counter++; 12: } 13: ?> 14: </body> 15: </html> </code> </code> در خط 7 ما مقدار counter را 1 گذاشتیم. در خط 8 حقله ای تشکیل دادم که تا وقتی اجرا می شود که counter از 12 کوچکتر و یا مساوی آن باشد. در خط 10 خروجی برنامه را می نویسیم و در خط 11 به counter دو عدد اضافه می کنیم. روش ++ را در درس قبلی خواندیم. پس خروجی برنامه می شود. 2 - 4 - 8 - 10 - 12 اگر شما در خط 11 فراموش می کردید که counter را زیاد کنید این حلقه تا بینهایت اجرا می شد چون هیچگاه counter زیاد نمی شد و هیچوقت از 12 بیشتر نمی شد. حلقه do و while این حلقه شبیه حلقه while است فقط سر و ته شده است ! بزرگترین فرق آن این است که ابتدا کدها اجرا می شوند و بعد درستی یا نادرستی عبارت چک می شود. PHP Code: <code style="white-space: nowrap;"> <code> do { // code to be executed } while ( expression ); </code> </code> توجه : آخر عبارت while در خط آخر حتما باید ; گذاشته شود. این متد وقتی خیلی به درد می خورد که شما بخواهید کد شما حداقل یکبار اجرا شود حتی اگر شرایط عبارت while اتفاق نیافتاده باشد. PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.7</title> 4: </head> 5: <body> 6: <?php 7: $num = 1; 8: do 9: { 10: print "Execution number: $num<br>\n"; 11: $num++; 12: } 13: while ( $num > 200 && $num < 400 ); 14: ?> 15: </body> 16: </html> </code> </code> در مثال بالا حقله do....while کنترل می کند که num بزرگتر از 200 و کوچتر از 400 باشد. چون ما num رو در خط 7 مساوی یک قراردادیم پس عبارت while درست نیست و False می باشد ولی در هر حال خروجی کد حداقل یک خط است که نوشته می شود Execution numnber : 1 . حقله For شما هیچ چیزی از استفاده از For به دست نمی آورید که نتوانید با While آن را ایجاد کنید. ولی در هر حال در اغلب مواقع استفاده از For کدهای زیباتر و بهتری نسبت به while ایجاد می کند. فرمت کلی به صورت زیر است : PHP Code: <code style="white-space: nowrap;"> <code> for ( variable assignment; test expression; variable increment ) { // code to be executed } </code> </code> هر عبارت داخل for باید حتما با ; از هم جدا شوند. معمولا ، عبارت اول یک متغیر شمارنده ایجاد می کند ، و در عبارت دوم عبارت کنترلی برای loop است ، و قسمت سوم اضافه کردن و کم نمودن متغیر را ایجاد می کند. مثال : PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.8</title> 4: </head> 5: <body> 6: <?php 7: for ( $counter=1; $counter<=12; $counter++ ) 8: { 9: print "$counter times 2 is ".($counter*2)."<br>"; 10: } 11: ?> 12: </body> 13: </html> </code> </code> در خط 7 بالا می توانید ببینید ، در قسمت اول counter را مساوی 1 نمودیم و در عبارت وسط محدود کردیم که حلقه تا وقتی کار کند که counter از 12 کوچکتر و یا مساوی آن باشد. در قسمت سوم هم عبارتی است که هر بار که کد اجرا شود یک عدد به counter اضافه نماید. مثال بالا و مثال قبلی هر دو یک خروجی را می دهند فقط کد for کمی جمع و جور تر از while است. به علت اینکه شروع ، پایان و شرایط حلقه در همان خط اول در For مشخص است ، با یک نگاه به این نوع حلقه کل حقله دستمان می آید. خروج از حلقه با استفاده از دستور break در هر دو روش ایجاد حلقه دستوری برای پایان دادن حلقه وجود دارد. گاهی اوقات نیاز است که وقتی کد به شرایط خاصی رسید حلقه پایان یابد. مثلا : PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.9</title> 4: </head> 5: <body> 6: <?php 7: for ( $counter=1; $counter <= 10, $counter++ ) 8: { 9: $temp = 4000/$counter; 10: print "4000 divided by $counter is... $temp<br>"; 11: } 12: ?> 13: </body> 14: </html> </code> </code> در کد بالا ما عدد 4000 رو بر counter که از 1 تا 10 متغیر است تقسیم می کنیم و خروجی را چاپ می کنیم. تا ایجا کد بدون نقص به نظر می رسد. ولی اگه مثلا counter از ورودی کاربر گرفته شود و کاربر مثلا عددی منفی بزند یا صفر وارد نماید و یا اینکه یک کلمه به جای عدد وارد کند. در این صورت ما باید حلقه رو قطع کنیم چون می دونیم که تقسیم کردن یک عدد بر صفر ایجاد خطا در php می کند. مثلا فرض کنید از -4 شروع کنیم تا 10 این وسط صفر هم جزو مقادیر counter خواهد شد. PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.10</title> 4: </head> 5: <body> 6: <?php 7: $counter = − 4; 8: for ( ; $counter <= 10; $counter++ ) 9: { 10: if ( $counter == 0 ) 11: break; 12: $temp = 4000/$counter; 13: print "4000 divided by $counter is... $temp<br>"; 14: } 15: ?> 16: </body> 17: </html> </code> </code> در کد بالا همونطور که می بینید در خط 10 و 11 تعریف کردیم که اگه counter صفر شد حلقه قطع شود. بنابراین کد بعد از رسیدن به صفر و به break می رسد حلقه را قطع می نماید و به خط 14 می رود. نکته جالب در کد بالا در خط 7 است که ما counter را خارج از حلقه تعریف نمودیم. بنابراین در خط 8 دیگه counter رو تعریف نکردیم و جاش رو خالی گذاشتیم. شما هر کدام از قسمتهای for رو می تونید خالی بگذارید ولی ; ها رو حتما باید بگذارید. استفاده از دستور continue خوب ، حالا فرض کنید که ما در کد بالا نمی خواهیم که وقتی به صفر رسید کد قطع شود و فقط می خواهیم که حلقه برای مقدار صفر اجرا نشود ولی باقی مقادیر اجرا شود. در این حالت از دستور continue استفاده می کنیم. PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.11</title> 4: </head> 5: <body> 6: <?php 7: $counter = − 4; 8: for ( ; $counter <= 10; $counter++ ) 9: { 10: if ( $counter == 0 ) 11: continue; 12: $temp = 4000/$counter; 13: print "4000 divided by $counter is... $temp<br>"; 14: } 15: ?> 16: </body> 17: </html> </code> </code> در کد بالا در خط 10 و 11 وقتی مقدار counter صفر شود ، حلقه قطع می شود و دوباره کد بر می گردد به خط 8 ولی فقط مقدار صفر رو اجرا نخواهد کرد. حلقه های تو در تو در php این قابلیت رو دارید که در داخل یک حقله یک یا چند حلقه دیگه رو نیز بیارید. ولی باید توجه داشته باشید که هر حلقه ای که در یک حلقه دیگر استفاده می کنید باید در همان حلقه تمام شود. مثلا : PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 5.12</title> 4: </head> 5: <body> 6: <?php 7: print "<table border="1">\n"; 8: for ( $y=1; $y<=12; $y++ ) 9: { 10: print "<tr>\n"; 11: for ( $x=1; $x<=12; $x++ ) 12: { 13: print "\t<td>"; 14: print ($x*$y); 15: print "</td>\n"; 16: } 17: print "</tr>\n"; 18: } 19: print "</table>"; 20: ?> 21: </body> 22: </html> </code> </code>
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم آموزش پي اچ پي (كلاس ها) قسمت هفتم [HR][/HR] ابجكت ها : ابجكت چيست ؟ مجموعه اي از متغييرها و توابع است كه از يك الگوي خاص به نام كلاس ساخته شده اند . اما كلاس ها چي هستن ؟ فرض كنيد ما يك شركت داريم كه اين شركت از بخش هاي مختلفي تشكيل شده است حال ما در هربخش احتياج داريم كه هر ماه يك گزارش مالي بگيريم ! ما اينجا دو كار ميتونيم بكنيم هم ميتونيم براي هربخش چند نفر بزاريم و انها گزارش مالي را تهيه كنند و هر ماه تحويل دهند در اين صورت در هربخش شلوغي و همچنين كارمند بيشتري نيازمنديم ! راه ديگر اينست كه يك قسمت به عنوان اتاق گزارش مالي درست كنيم و هر بخش داده هاي خود را به اين قسمت بدهيم و گزارش مالي خود را دريافت كنيم در اين روش هم بخش ها منظم تر خواهند بود و هم ديگر احتياج به كارمند اضافي نداريم . در اينجا ابجكتها نقش كارمند در بخش گزارش مالي را بر عهده دارند فكر ميكنم مفهوم كلاس را درك كرده باشيد . بزاريد شكل كلي يك كلاس را برايتان نشان دهم PHP Code: <code style="white-space: nowrap;"> <code> Class First_class { //اين شكل كلي از يك كلاس هستش } </code> </code> پروپرتي ها: آبجكتها به متغيير هاي خاصي دسترسي دارند كه به آنها پروپرتي ميگويند اين پروپرتي ها ميتونند در هرجاي بدنه كلاس باشند اما براي اينكه كد مون مرتب باشه بهتره كه در بالاي كلاس تعريف بشن. بگزاريد با مثالي ديگر بيشتر توضيح بدم : PHP Code: <code style="white-space: nowrap;"> <code> Class f_class { var $name="mehdi"; } $obj1=new f_class(); $obj2=new f_class(); $obj1->name="Ali"; print "$obj1->name<br>"; print"$obj2->name<br>"; </code> </code> ديديم كه براي اختصاص دادن يك كلاس به يك متغيير اينگونه عمل كرديم PHP Code: <code style="white-space: nowrap;"> <code> $obj1=new f_class(); </code> </code> علامت <- به شما اجازه ميده تا به متغيير هاي درون يك كلاس دسترسي داشته باشيد و اونها رو تغيير بديد همونطور كه در كد ميبينيد ما در خط ششم متغيير name در ابجكت يك رو مساوي علي قرار داديم كه باعث عوض شدن متغيير ميشه همچنين براي چاپ خروجي نيز به همين صورت عمل كرديم ولي بدون علامت مساوي PHP Code: <code style="white-space: nowrap;"> <code> Print " $obj1->name "; </code> </code> متد ها : متدها در واقع توابعي هستند كه داخل يك كلاس وجود دارند بزاريد با يك مثال واضح تر بيان كنم : PHP Code: <code style="white-space: nowrap;"> <code> class f_class { var $name; function sayHello() { Print "Hello World"; } } $obj1=new f_class(); $obj1->sayHello(); // Hello World چاپ ميشود </code> </code> همونطور كه ميبينيد يك متد خيلي شبيه به تابع معمولي هستش با اين تفاوت كه متد هميشه داخل كلاس تعريف ميشه در ضمن شما ميتونيد با علامت <- يك متد ابجكت را صدا بزنيد مهمتر اينكه متدها به اعضاي متغيير هاي يك كلاس دسترسي دارند شما همين الان ديديد كه چطوري به يك پروپرتي از خارج يك آبجكت دسترسي پيدا كنيم اما چطوري يك آبجكت ميتونه خودشو به اصطلاح Return كنه : PHP Code: <code style="white-space: nowrap;"> <code> class f_class { var $name="mehdi"; function sayHello() { Print "Hello My names $this->name<br>"; } } $obj1=new f_class(); $obj1->sayHello(); // Hello My names mehdi چاپ ميكنه </code> </code> يك عبارت مخصوص رو بكار برديم به اسم this$ تا كلاس به آبجكت كنوني Return بشه شما با تركيب اين عبارت با علامت <- ميتونيد داخل يك كلاس به هر پروپرتي و متدي كه بخواهيد دسترسي داشته باشيد حالا اگه بخواهيم به پروپرتي name در همه آبجكت هاي كلاسمون مقدار خاصي بديم ميتونيم به اين صورت عمل كنيم : PHP Code: <code style="white-space: nowrap;"> <code> class f_class { var $name="mehdi"; function setName($n){ $this->name=$n; } function sayHello() { Print "Hello My names $this->name<br>"; } } $obj1=new f_class(); $obj1->setName("Ali"); $obj1->sayHello(); // Hello My names Ali چاپ ميكنه </code> </code> همونطور كه ديديد اومديم يه تابع تعريف كرديم كه اسم رو بتونيم همه جا تغيير بديم واز دستورthis براي عوض كردنش داخل كلاس استفاده كرديم. در ابتدا اسم ما مهدي بود ولي بعد از اينكه تابع عوض كردن اسم رو بكار برديم متد صدا زده شد و اسم تغيير كرد كد بالا رو ميتونستيم بصورت ساده تر وكمي پيچيده تر هم بنويسيم : PHP Code: <code style="white-space: nowrap;"> <code> class first_class { var $name; function first_class( $n="mehdi" ) { $this->name = $n; } function sayHello() { print "hello my name is $this->name<BR>"; } } $obj1 = new first_class("َAli"); $obj2 = new first_class("Asef"); $obj1->sayHello(); // hello my name is Ali چاپ ميكنه $obj2->sayHello(); // hello my name is Asef چاپ ميكنه </code> </code> همونطور كه ديديد اومديم و يه متد يا تابع با همون اسم كلاس خودمون ساختيم و مقدار ديفالتش رو روي مهدي گزاشتيم كه اگر هيچي وارد نشد اين عبارت چاپ بشه حالا در پايين در خط دهم و يازدهم هنگامي كه ابجكت يك و ابجكت دو رو به كلاس ها اختصاص ميديم همون موقع هم مقدار اسم رو عوض ميكنيم و مشكلي پيش نمياد كلاسمون هنگامي كه متد صدا زده ميشه خود به خود صدا زده ميشه. حال بزاريد با عبارت ديگري به اسم extends اشنا بشيم اين عبارت به اين معني ارث بردن است به اين مثال توجه كنيد : PHP Code: <code style="white-space: nowrap;"> <code> class first_class{ var $name = "mehdi"; function first_class( $n ) { $this->name = $n; } function sayHello(){ print "Hello my name is $this->name<br>"; } } class second_class extends first_class { } $test = new second_class("son of mehdi"); $test->sayHello(); // outputs "Hello my name is son of mehdi" </code> </code> همونطور كه ميبينيد ما كلاس دو رو تنظيم كرديم تا از كلاس يك ارث بري كنه وهمه متد هاي كلاس يك را خواهد داشت ما ميتونيم اينجا داخل كلاس دو يك تابع با اسم sayHello بسازيم و بگيم عبارت I dont know my name رو چاپ كنه در اينصورت اگه حتي در خط 12 ام ما يك عبارت براي تعويض اسم بديم تاثيري نميكنه و همون عبارت I dont know my name رو چاپ ميكنه راه ديگري هم هست و اون چاپ هردو كلاس باهم هست : PHP Code: <code style="white-space: nowrap;"> <code> class first_class { var $name = "harry"; function first_class( $n ) { $this->name = $n; } function sayHello() { print "Hello my name is $this->name<br>"; } } class second_class extends first_class { function sayHello() { print "I'm not going to tell you my name -- "; first_class::sayHello(); } } $test = new second_class("son of harry"); $test->sayHello(); // "I'm not going to tell you my name -- Hello my name is son of harry" چاپ ميكنه </code> </code> همونطور كه ميبينيد دستور ( متد:: وارث ) ما ميتونيم هر متدي رو كه ما تغييرش داديم دوباره صدا بزنيم چون در كلاس دو ما متد sayHello رو تغيير داديم با اين دستور اونو دوباره برگردونديم .
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم آموزش پي اچ پي (فرم ها) – قسمت هشتم كار كردن با فرم ها خوب در اين قسمت ميخواهيم ببينيم چجوري با استفاده از فرمها اطلاعات رو بين صفحات ارسال كنيم. خوب يه مثال ساده ولي پركاربرد : PHP Code: <code style="white-space: nowrap;"> <code> #this page name is a.php <form action="b.php" method="get"> <input type="text" name="user"> <input type="submit" name="btn"> </form> </code> </code> قصد داريم اطلاعات يك تكست باكس رو كه در اين صفحه قرار داره توسط صفحه دوم به اسم b.php بخونيم پس اسم اين صفحه رو كه هيچ كد پي اچ پي توش استفاده نكرديم ميزاريم a.php و ذخيره ميكنيم. حالا ميرسيم به صفحه دوم اين كد رو تو صفحه دوم قرار بديد . <?php print "$user" ?> خيلي ساده و به اين صورت اطلاعات رو ميگيريم يوزر اسم تكست باكسي هست كه تو فرم اول قرار داشت. بقيه كد ها هم اچ تي ام هست و نيازي به توضيح نيست فقط در مورد get بگم كه اين دستور متغيير ها رو موقع ارسال تو ادرس نشون داده ميشه و شايد بعضي جاها زياد راه مطمئني نباشه ولي اگه بجاي اين عبارت از post استفاده كنيم ديگه در ادرس نشون داده نميشه . تركيب كردن پي اچ پي با اچ تي ام ال : به اين كد نگاه كنيد : PHP Code: <code style="white-space: nowrap;"> <code> <form action="<?php print $PHP_SELF?>" method="POST"> name: <input type="text" name="user"> </form> </code> </code> وقتي اين فرم رو اجرا كنيم فرم همواره خودشو صدا ميزنه چون ما از عبارت $PHP_SELF استفاده كرده ايم توجه كنيد كه ما هيچ دكمه اي رو صفحه قرار نداديم و در بيشتر مرورگرها با زدن كليد اينتر ميتونيم فرم رو اجرا كنيم . البته در كد بالا هيچ اطلاعاتي رو بيرون نميده ولي در كد زير ميخواهيم يه بازي ساده بنويسيم تا بيشتر متوجه بشيم : PHP Code: <code style="white-space: nowrap;"> <code> <?php $num_guess=42; $msg=" "; if (! Isset($guess)) { $msg="welcome To This Little Game"; } elseif ($guess>$num_guess) { $msg="number $guess is Big! Try Smaller number."; } elseif($guess<$num_$guess) { $msg="Number $guess is Small ! Try Big Number"; } else // vagti mosavi bashe { $msg="Well Done You Win"; } ?> </code> </code> توضيحات : با دستور ! كه اشنا هستيد همون دستور نقض ، اما دستور isset اين دستور چك ميكنه ببينه اصلا اطلاعاتي وارد شده يا نه ما در خط اول چك ميكنيم ببينم (اگه نه اطلاعاتي وارد شده) انگاه پيغام خوش آمد گويي رو پخش كن اين كد موقعي ميتونه اتفاق بيفته كه برا اولين بار صفحه رو باز كرده يا هيچ اطلاعاتي وارد نكرده . حالا ميرسيم به قسمت اچ تي ام ال اين كد رو زير كد بالايي قرار بديد PHP Code: <code style="white-space: nowrap;"> <code> <h1> <?php print $msg ?> </h1> <form action="<?php print $PHP_SELF?>" method="POST"> Guess Number : <input type="text" name="guess"> </form> </code> </code> خوب اين كد نيز اطلاعات رو از كاربر ميگيره و صفحه رو دوباره اجرا ميكنه و پيغام مناسب رو پخش ميكنه . ميخوايم با يه دستور جديد و كاربردي اشنا بشيم فرض كنيم بعد از اينكه كاربر در بازي بالا برنده شد ميخواهيم او را به يه صفحه جديد بفرستيم يعني ريدايركت كنيم ميتونيم از دستور زير استفاده كنيم اين دستور رو بجاي پيغامي بزاريد كه وقتي كاربر برنده ميشه انتخاب ميشه يعني بعد از else قرار بديد : PHP Code: <code style="white-space: nowrap;"> <code> header("Location: page.html"); exit; </code> </code> با دستور exit هم از داخل اين كد بيرون ميايم و به صفحه بعد منتقل ميشيم . نوبتي هم باشه نوبت كار با فايل هاست : PHP Code: <code style="white-space: nowrap;"> <code> <form enctype="multipart/form-data" action="<?print $PHP_SELF?>" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="51200"> <input type="file" name="fupload"><br> <input type="submit" value="upload!"> </form> </code> </code> خوب ما با استفاده از دستور enctype="multipart/form-data" درواقع ميايم همون فايل ديالوگ رو باز ميكنيم در قسمت بعد ما يك متغيير مخفي ايجاد ميكنيم و سايز فايل رو تعيين ميكنيم و توش قرار ميديم كه در اينجا 51200 انتخاب كرديم حالا با دو خط بعد يه تكست باكس و يه دكمه ميزاريم . ما اينجا به كاربر اجازه ميديم تا 50 كيلوبايت فايل اپلود كنه . البته كد بالا جنبه نمايش داشت و عملا كاربرد زيادي نداره قبل از اينكه نمونه قابل اجرا رو امتحان كنيم بزاريد ليستي از متغيير هاي فايل اپلود رو براتون بگم مثال توضيح نام متغيير /tmp/php3d3ef مسير فايل اپلود شده $fupload Test.gif اسم فايل اپلود شده $fuploadname 51200 حجم بر حسب بايت $fuploadsize Image/gif نوع فايل اپلودي $fupload type حالا مثال ، در اين مثال ما اطلاعات فايل اپلئدي رو نمايش ميديم PHP Code: <code style="white-space: nowrap;"> <code> 1: <html> 2: <head> 3: <title>Listing 9.15 A file upload script</title> 4: </head> 5: <?php 6: $file_dir = "/home/mehdi/htdocs/uploads"; 7: $file_url ="http:// www.safary.com/mehdi/uploads"; 8: if ( isset( $fupload ) ) 9: { 10: print "path: $fupload<br>\n"; 11: print "name: $fupload_name<br>\n"; 12: print "size: $fupload_size bytes<br>\n"; 13: print "type: $fupload_type<p>\n\n"; 14: if ( $fupload_type == "image/gif" ) 15: { 16: copy ( $fupload, "$file_dir/$fupload_name") or die ("Couldn't copy"); 17: 18: print "<img src=\"$file_url/$fupload_name\"><p>\n\n"; 19: } 20: } 21: ?> 22: <body> 23: <form enctype="multipart/form-data" action="<?php print $PHP_SELF?>" method="POST"> 24: <input type="hidden" name="MAX_FILE_SIZE" value="51200"> 25: <input type="file" name="fupload"><br> x<input type="submit" value="Send file!"> 27: </form> 28: </body> 29: </html> </code> </code> فكر نميكنم نيازي به توضيح باشه بجز اين خط ( $fupload, "$file_dir/$fupload_name") copy اين دستور فايل مورد نظر رو روي سرور كپي ميكنه و اگه اشكالي پيش اومد عبارت Couldn't copy رو چاپ ميكنه در اينجا ما پس از اينكه از كاربر فايل رو درخواست كرديم اطلاعات مربوط به اون فايل رو نمايش ميديم كه ما در اينجا فرض كرديم كه كاربر يك عكس را اپلود كرده است
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم 1 آموزش پي اچ پي قسمت نهم(كار با فايلها) كار با فايلها در پي اچ پي پيوست دادن كدهاي ديگر در كد خود مان: شما ميتونيد يك كد رو در يك فايل ديگر بنويسد و هرجا لازم شد در يك كد ديگر كه در فايل ديگري هم قرار داره اونو صدا بزنيد تابع Include(); اين امكان رو به شما ميده و باعث سهولت و كم حجم شدن صفحات ميشه . اين تابع فقط به يك آرگومان نياز داره و اون مسير فايل پي اچ پي هست كه ميخوايم به صفحمون پيوند بديم بزاريد با يك مثال راحتتر بيان كنم : فرض كنيد ما در فايل a.php يك كد داريم كه يك پيغام رو چاپ ميكنه حالا ما ميخوايم همين دستور در فايل اول رو در فايل b.php بدون نوشتن دوباره دستور و با دستور اينكلود بنويسيم كافيه بنويسيم PHP Code: <code style="white-space: nowrap;"> <code> // file name is b.php <?php include("a.php"); ?> //will Print message in a.php </code> </code> البته چون در اينجا ما در فايل اولمون يك خط دستور داريم فرقي نميكنه ولي اگه چندين خط و چندين دستور باشه كار مارو خيلي راحت ميكنه چون فقط با يه خط كد ميتونيم همون دستورات رو صدا بزنيم . حتي ميتونيم يك مقدار رو با دستور اينكلود صدا بزنيم يا دستور اينكلود رو با توجه به يه شرط صدا بزنيم. يك مثال : PHP Code: <code style="white-space: nowrap;"> <code> <?php //this file name is a.php $ret=(4+4); return $ret; ?> </code> </code> _______ PHP Code: <code style="white-space: nowrap;"> <code> <?php //this file name is b.php $flag=true; if($flag) { $resualt=include("a.php"); print " The Sum Of (4+4) Is $resualt"; } ?> </code> </code> همونطور كه ديديد ميتونيم طوري تعريف كنيم كه اگه شرط درست نبود اصلا دستور اينكلود اجرا نشه و در خط بعدي مقدار فايل a.php رو توي يه متغيير ديگه مينوسيسم و چاپ ميكنيم . خوب بهتر بود قبل از اينكه بقيه آموزش رو بگم اينارو ميدونستيد حالا ميرسيم به كار با فايل ها : اولين تابعي كه ميخوايم بررسي كنيم تابع چك كردن وجود يك فايل هست ! به اين مثال توجه كنيد : PHP Code: <code style="white-space: nowrap;"> <code> <?php if (file_exists("a.php")) print "The File Exists"; ?> </code> </code> حتي ميتونيد با تابع ديگري بفهميد مسير داده شده يك فايل هست يا يك دايركتوري PHP Code: <code style="white-space: nowrap;"> <code> //Check if it's a file <?php if(is_file("a.php") print"yes this is file"; ?> /*-----------------------------*/ //Check if Current Path is a dir <?php if(is_dir("/tmp")) print"/tmp is valid"; ?> </code> </code> تابع ديگري كه وجود داره توابع is_readable , is_writeable , is_executeable هستن كه چك ميكنن ببينن فايل مورد نظر قابل خواندن و يا نوشتن ويا اجرا شدن هست يا مسير داده شده معتبر هست يا نه و يك مقدار از نوع بولين برميگردونه . تابع ديگري نيز وجود دارد كه سايز يك فايل رو برميگردونه خيلي ساده Print filesize("a.php"); اين تابع سايز فايل شما رو برحسب بايت نمايش ميده تابع ديگري كه ميخوايم بررسي كنيم تابع fileatime(); ميباشد كه اخرين باري كه يك فايل دسترسي پيدا كرد رو به ما بر ميگردونه ما در مثال زير ميخوايم بدونيم فايل a.php در چه تاريخ و زماني براي اخرين بار دسترسي پيدا كرده است : PHP Code: <code style="white-space: nowrap;"> <code> <?php $lasttime=fileatime("a.php"); print "The File last time accessed in ".date("D d M Y g:i A",$lasttime)."."; // Will Print Sat 14 jan 2006 10:30 Pm ?> </code> </code> تابع filemtime(); نيز مشابه fileatime(); هستش با اين تفاوت كه تاريخ و زمان اخرين باري كه فايل ويرايش شد رو برميگردونه . تابع filectime(); نيز وجود داره كه در سيستم هاي يونيك تاريخ تغيير يا ويرايش فايل رو برميگردونه ولي در پلت فرم هاي ديگه تاريخ بوجود آمدن فايل رو برميگردونه حالا ميرسيم به توابع كاربردي تر : تابع touch("file-path.txt"); در صورتي كه فايلي با اين نام وجود نداشته باشد اين فايل رو ايجاد ميكنه ولي اگه وجود داشته باشه كاري نميكنه و فقط تاريخ ويرايش فايل تغيير پيدا ميكنه و فايل از بين نميره با تابع unlink("file-path.txt"); ميتونيد يك فايل رو پاك كنيد نكته : در سيستم هاي يونيكس براي اينكه يك فايل را پاك يا ويرايش يا دست يابي پيدا كنيم لازم است كه دسترسي به فايل رو داده باشيد . بازكردن فايل قبل از خواندن و نوشتن : قبل از اينكه بتونيد يك فايل رو بخونيد يا محتوايش رو عوض كنيد به اين احتياج داريد كه اون فايل رو باز كنيد شما با اين دستور ميتونيد يك فايل رو براي خواندن اماده كنيد $f=fopen("file.txt",'r'); و با اين دستور ميتونيد فايل رو براي نوشتن اماده كنيد $f=fopen("file.txt",'w'); و براي اضافه كردن اطلاعات به يك فايل بايد از اين دستور استفاده كنيد (َAppend) $f=fopen("file.txt",'a'); بهتره قبل از اينكه اقدام به ويرايش يا باز كردن يك فايل كنيد اون رو امتحان كنيد ببينيد اجازه باز شدن يا ويرايش شدن رو داره ؟ PHP Code: <code style="white-space: nowrap;"> <code> If ($fp=fopen("file.txt",'w')) { // codehaie marboot be viraiesh file } </code> </code> يا ميتونيد بجاي كد بالا اينگونه عمل كنيد PHP Code: <code style="white-space: nowrap;"> <code> ($fp=fopen("file.txt",'w')) or die("Could Not open file"); </code> </code> اگه دستور فوق مقدار درست رو برگردونه پيغام Could Not open file نشون داده نميشه در غير اينصورت نشون داده ميشه . همون طور كه متوجه شديد هر عملياتي كه بخوايم بر سر فايل اجرا كنيم بايد داخل : Fopen(); // Code Fclose(); انجام بديم. پي اچ پي امكانات زيادي رو براي خوندن يك فايل در اختيار ما ميزاره بعنوان مثال شما ميونيد يك فايل رو برحسب بايت يا برحسب لاين يا برحسب كاراكتر بخونيد . بزاريد ابتدا يك مثال رو نگاه كنيم و بعد توضيحات مربوطه رو بخونيم : PHP Code: <code style="white-space: nowrap;"> <code> <?php $filename = "test.txt"; $fp = fopen( $filename, "r" ) or die("Couldn't open $filename"); while ( ! feof( $fp ) ) { $line = fgets( $fp, 1024 ); print "$line<br>"; } ?> </code> </code> با استفاده از دستور feof(); چك ميكنيم ببينم به اخر فايل رسيديم يا نه و اگه نه ميايم خط به خط با دستور وايل خط هاي فايل رو داخل يك متغيير ميريزيم و اونها رو چاپ ميكنيم . دستور fgets($fp,1024) اينكارو ميكنه و ميگه كه طول هر خط ميتونه تا 1024 بايت باشه . ما ميتونيم مقدار خاصي از فايلمون رو بخونيم مثلا 16 بايت يا 16 كاراكتر از فايلمون رو بخونيم PHP Code: <code style="white-space: nowrap;"> <code> <?php $filename = "test.txt"; $fp = fopen( $filename, "r" ) or die("Couldn't open $filename"); while ( ! feof( $fp ) ) { $chunk = fread( $fp, 16 ); print "$chunk<br>"; } ?> </code> </code> همونطور كه ديديد با دستور fread( $fp, 16 ); ما 16 كاراكتر از فايلمون رو ميخونيم . شما ميتونيد با تابع fseek() جاي مشخصي از فايل رو بخونيد به مثال زير نگاه كنيد PHP Code: <code style="white-space: nowrap;"> <code> <?php $filename = "test.txt"; $fp = fopen( $filename, "r" ) or die("Couldn't open $filename"); $fsize = filesize($filename); $halfway = (int)( $fsize / 2 ); fseek( $fp, $halfway ); $chunk = fread( $fp, ($fsize − $halfway) ); print $chunk; ?> </code> </code> در كد بالا ما نيمه دوم يك فايل رو چاپ ميكنيم .همه چيز واضح و روشن هست ونيازي به توضيح نيست دستور fgetc(); مثل دستور fgets() ميباشد كه اگه در كد بالا كه خط به خط يك فايل رو اجرا ميكرد بزاريد كاراكتر به كاراكتر فايل رو نشون ميده . براي نوشتن يا اضافه كردن مقدار به يك فايل بايد ابتدا فايل رو بصورت Foper("file.txt",'w'); Or Fopen("file.txt",'a'); شما ميتونيد با تابع fwrite(); داخل يك فايل مقداري رو قرار بديد ، دقت كنيد كه در اينصورت محتواي فايل قبلي پاك ميشه و ميتونيد با تابع fputs(); يك مقدار رو به فايل مورد نظر اضافه كنيد . كار كردن با اين دستورها ساده هست با اين حال يك مثال ميارم : PHP Code: <code style="white-space: nowrap;"> <code> <?php $filename = "test.txt"; $fp = fopen( $filename, "w" ) or die("Couldn't open $filename"); fwrite( $fp, "Hello world\n" ); fclose( $fp ); print "Appending to $filename<br>"; $fp = fopen( $filename, "a" ) or die("Couldn't open $filename"); fputs( $fp, "And Hello To You\n" ); fclose( $fp ); ?> </code> </code> حال ميرسيم به تابع تعيين دسترسي فايل شما ميتونيد با دستور flock(); براي يك فايل دسترسي هاي متفاوتي رو اعمال كنيد ليست شماره دسترسي ها به اين صورت است PHP Code: <code style="white-space: nowrap;"> <code> 1 ---- Sharing اجازه خواندن ميده ولي نوشتن خير 2 ---- Exclusive اجازه خواندن و نوشتن نميدهد 3 ---- Release دسترسي هاي بالا را ازاد ميكند </code> </code> نوبتي هم باشه نوبت كار با پوشه هاست : شما ميتونيد با دستور mkdir() , rmdir() پوشه اي ايجاد يا پاك كنيد توابع ساده اي هستن و نيازي به مثال نيست يك مثال براي بيشتر آشنا شدن با اين نوع توابع ، ميخوايم فايل هاي داخل يك پوشه رو نمايش بديم PHP Code: <code style="white-space: nowrap;"> <code> <?php $dirname = "testdir"; $dh = opendir( $dirname ); while ( gettype( $file = readdir( $dh )) != boolean ) { if ( is_dir( "$dirname/$file" ) ) print "(D)"; print "$file<br>"; } closedir( $dh ); ?> </code> </code> ما با دستور opendir() پوشه مورد نظرمون رو در ابتدا باز ميكنيم سپس با دستور وايل مسير فايلهامون رو ميگيريم و چك ميكنيم اگه متعلق به اين دايركتوري بودن عبارت (D) و سپس اسم فايل و مسيرش رو چاپ ميكنيم در نهايت با دستور closedir() ميبنديم . دستور readdir مقدار درست يا نادرست رو برميگردونه و اين بر حسب اين هست كه هر عددي بجز صفر مقدارش ترو ميشه بزاريد با مثالي توضيج بدم فرض كنيم ما چهار تا فايل داريم كه بر حسب ايندكس ما ميايم اينارو داخل وايل چك ميكنيم و تا زماني كه ايندكس صفر نشده شرط وايل ما درست هست و ادامه ميده و هنگامي كه صفر شد از وايل خارج ميشه
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم آموزش پي اچ پي قسمت دهم - ديتابيس هاي فايلي كار با ديتابيس ها (فايل) اگه شما به ديتابيس هاس اس كيو ال مثل ماي اس كيو ال و اوراكل دسترسي نداريد ميتونيد از ديتابيس هاي DBM استفاده كنيد حتي اگه شما اگه نداشته باشينش پي اچ پي اون رو براي شما شبيه سازي ميكنه و به شما اجازه ميده داده هاتون رو توش ذخيره كنيد و بازيابي كنيد شون . در ضمن شما نياز به استفاده از دستورات اس كي ال نداريد چون بسيار راحت و انعطاف پذير هستن . در اين بخش ياد ميگيريم چطور : يك ديتابيس DBM رو باز كنيم چگونه داده را وارد كنيم چگونه داده را فراخواني كنيم چگونه تغيير ايجاد كنيم يا داده هارا پاك كنيم چگونه داده هاي پيچيده اي را وارد ديتا بيس كنيم باز كردن ديتا بيس : با استفاده از دستور dbmopen() شما ميتونيد ديتا بيس را باز كنيد و اين تا بع دو آرگومان ميگيره يكي مسير ديتابيسمون و ديگري نوع دسترسي به ديتا بيس كه نوع دسترسي ها به اين شكل هست توضيح نوع دسترسي در حالت فقط خواندي r براي خواندن و نوشتن w ساختن ديتابيس و اگر وجود دارد براي خواندن و نوشتن c ساخت يك ديتابيس جديد n با استفاده از دستور زير اگر ديتابيسي با اين نام وجود نداشته باشد باز ميشود : PHP Code: <code style="white-space: nowrap;"> <code> $db = dbmopen( "./products", "c" ) or die( "Couldn't open DBM" ); </code> </code> نكته : دقت كنيد كه ما از دستور die براي زماني استفاده كرديم كه قادر به ايجاد ديتابيس نباشيم . وقتي كارمون با ديتا بيس تموم شد با استفاده از دستور زير ديتابيس رو ميبنديم . PHP Code: <code style="white-space: nowrap;"> <code> dbmclose($db); </code> </code> اگه شما ديتابيس رو نبنديد قسمت هاي ديگري از برناممون كه به ديتابيس نياز دارند مجبور هستن تا صبر كنند و اين اصلا خوب نيست . اضافه كردن اطلاعات به ديتابيس : به مثال زير توجه كنيد : PHP Code: <code style="white-space: nowrap;"> <code> <?php $db=dbmopen("./users","c") or die("Could not open DBM"); dbminsert($db,"PersianTools.com","30000"); dbminsert($db,"IranVig.com","6000"); dbminsert($db,"CodeVig.com","100"); dbmclose($db); ?> </code> </code> و اينگونه اطلاعات رو اضافه ميكنيم و حالا براي تغيير اطلاعات به اين شكل عمل ميكنيم : PHP Code: <code style="white-space: nowrap;"> <code> <?php $db=dbmopen("./users","c") or die("Could not open DBM"); dbmreplace($db,"PersianTools.com","464420"); dbmreplace ($db,"IranVig.com","62351"); dbmreplace ($db,"CodeVig.com","6463"); dbmclose($db); ?> </code> </code> حالا كه ما تونستيم اطلاعاتمون رو وارد ديتابيس كنيم احتياج داريم تا اونهارو بتونيم بخونيم پس به اين صورت عمل ميكنيم : PHP Code: <code style="white-space: nowrap;"> <code> $users=dbmfetch($db,"PersianTools.com"); </code> </code> خيلي ساده بزاريد اين اطلاعات رو در قالب يك جدول فراخواني كنيم : PHP Code: <code style="white-space: nowrap;"> <code> <table border=1 cellpadding ="5"> <tr> <td align="center"> <b>product</b></td> <td align="center"> <b>price</b> </td> </tr> <?php $db = dbmopen( "./users", "c" ) or die( "Couldn't open DBM" ); $key = dbmfirstkey( $db ); while ( $key != "" ) { $value = dbmfetch( $db, $key ); print "<tr><td align = \"left\"> $key </td>"; print "<td align = \"right\"> \$$value </td></tr>"; $key = dbmnextkey( $db, $key ); } dbmclose( $db); ?> </table> </code> </code> و به اين صورت تمام اطلاعات رو با استفاده از يك حلقه فراخواني ميكنيم حالا شايد سوال پيش بياد كه چجوري بفهميم دادمون قبلا تو ديتا بيس وارد شده يا نه ؟؟ PHP Code: <code style="white-space: nowrap;"> <code> if ( dbmexists( $db, "PersianTools.com" ) ) print dbmfetch( $db, " PersianTools.com " ); </code> </code> براي پاك كردن يك مقدار از دستور PHP Code: <code style="white-space: nowrap;"> <code> dbmdelete($db,"PersianTools.com"); </code> </code> استفاده ميكنيم .
پاسخ : آموزش برنامه نويسي شيء گرا با PHP - قسمت اول و دوم و سوم آموزش پي اچ پي قسمت دهم - ديتابيس هاي فايلي اضافه كردن يك مقدار پيچيده به ديتابيس : PHP Code: <code style="white-space: nowrap;"> <code> $array = array( 1, 2, 3, 4 ); $db = dbmopen( "./ test", "c" ) or die("Couldn't open test DBM"); dbminsert( $db, "arraytest", $array ); print gettype( dbmfetch( $db, "arraytest" ) ); </code> </code> خوب باشه يه مثال كامل : PHP Code: <code style="white-space: nowrap;"> <code> <?php $products = array("PersianTools.com" => array( users=>"2200",stats=>"1500", color=>"blue" ), "Iranvig.com" => array( users=>"2213",stats=>"1234",color=>"blue" ) ); $db = dbmopen( "./test", "c" ) or die("Couldn't open products DBM"); while ( list ( $key, $value ) = each ( $products ) ) dbmreplace( $db, $key, serialize( $value ) ); dbmclose( $db ); ?> </table> </code> </code> بزاريد يك مثال كلي بزنيم تا بيشتر آشنا بشيم ما در اين مثال اطلاعات ديتابيسمون رو داخل يه جدول ميكشيم و كنار هر داده يه گزينه ميزاريم تا با انتخاب اون بتونه پاك كنه داده رو و همينطور يك تكست براي ويرايش ميزاريم و اين بخش رو تموم ميكنيم . PHP Code: <code style="white-space: nowrap;"> <code> <?php $dbh = dbmopen( "./users", "c" ) or die("Couldn't open test DBM"); if ( isset ( $delete ) ) { while ( list ( $key, $val ) = each ( $delete ) ) { unset( $prices[$val]); dbmdelete( $dbh, $val ); } } if ( isset ( $prices ) ) { while ( list ( $key, $val ) = each ( $stats ) ) dbmreplace( $dbh, $key, $val ); } if ( ! empty( $name_add ) && ! empty( $stats_add ) ) dbminsert( $dbh, "$name_add", "$stats_add" ); ?> <html> <body> <form action="<? print $PHP_SELF; ?>" action="POST"> <table border="1"> <tr> <td>delete</td> <td>Users</td> <td>stats</td> </tr> <?php $key = dbmfirstkey( $dbh ); while ( $key != "" ) { $price = dbmfetch( $dbh, $key ); print "<tr><td><input type='checkbox' name=\"delete[]\" "; print "value=\"$key\">$/td>"; print "<td>$key</td>"; print "<td> <input type=\"text\" name=\"prices[$key]\" "; print "value=\"$stat\"> </td></tr>"; $key = dbmnextkey( $dbh, $key ); } dbmclose( $dbh ); ?> <tr> <td> </td> <td><input type="text" name="name_add"></td> <td><input type="text" name="stats_add"></td> </tr> <tr> <td colspan=3 align="right"> <input type="submit" value="amend"> </td> </tr> </table> </form> </code> </code> فكر ميكنم اين سوال براتون پيش بياد كه چه موقع بايد از اين نوع ذخيره داده استفاده كنيم : خوب بايد بگم زماني كه داده هاي كمي برا ذخيره كردن داريد ميتونيد از اين روش استفاده كنيد كه خيلي روش ساده اي هست و بدرد بخور . اميدوارم لذت برده باشيد