PDA

View Full Version : سوال: استفاده از property تعریف نشده - mvc



desatir7316
جمعه 18 اسفند 1391, 10:26 صبح
سلام دوستان
اول یه نگاهی به کدهای زیر بندازید:

index.php


<?php
define('APPLICATOIN_PATH', '../');

$paths = array(
APPLICATOIN_PATH,
get_include_path()
);

set_include_path(implode(PATH_SEPARATOR,$paths));

function __autoload($className){
$fileName = str_replace('\\', '/', $className).'.php';
require_once $fileName;
}#end of autoloaded func

use com\tempphp\models as Models;
$obj = new Models\User();
$obj->setFirstName('ali');
print $obj->getFirstName();
?>



User.php



<?php
namespace com\tempphp\models;
class User {

public function __toString() {
return "$this->firstName $this->lastName lives in $this->address!";
}
public function __call($name, $arguments) {
$propertyMethod = substr($name, 0, 3);
$propertyName = strtolower($name[3]). substr($name, 4);

switch($propertyMethod){
case 'set':
if(count($arguments) == 1){
$this->$propertyName = $arguments[0];
}#end of if
break;
case 'get':
return $this->$propertyName;
break;
}#end of switch
}#end of __call func

}
?>



حالا ببنیند من property به نام firstName رو اصلا داخل کلاس User تعریف نکردم، ولی وقتی توی index.php استفاده می کنم ازش بدون هیچ موردی مقدار می گیره و مقدارشو می تونم برگردونم.
سوالم اینه که اگه به property وجود نداشته باشه، به وجود میاد؟ مثلا اشتباه تایپی باشه ارور نمی ده و میاد اون property رو ایجاد می کنه؟
اگه این قضیه درست باشه، چه طوری می شه جلوشو گرفت؟
ممنون

desatir7316
جمعه 18 اسفند 1391, 11:09 صبح
فکر کنم به خاطره اینه که این زبان اسکریپی هست و با تعریف متغیر مشکلی نداره(کسی که جواب نمی ده، حد اقل خودم جواب خودم رو بدم فردا عقده ای نشم برم معتاد شم)

linuxUser
جمعه 18 اسفند 1391, 11:45 صبح
سلام دوست عزیز
جواب شما در تابع زیر مشخص هست اگه یه کم در دستورات دقت کنید می بینید که چرا اون کد داره کار می کنه

public function __call($name, $arguments) { $propertyMethod = substr($name, 0, 3); $propertyName = strtolower($name[3]). substr($name, 4); switch($propertyMethod){ case 'set': if(count($arguments) == 1){ $this->$propertyName = $arguments[0]; }#end of if break; case 'get': return $this->$propertyName; break; }#end of switch }#end of __call func
این کد داره بیان می کنه که با فراخوانی آبجکت های ساخته شده از این کلاس که 3 حرف اولشون برابر set هست چطور برخورد کنه و اگه 3 حرف اولشون برابر get بود چطور برخورد کنه

desatir7316
جمعه 18 اسفند 1391, 11:52 صبح
ممنون ولی ظاهرا شما به سوال من اصلا دقت نکردید
مشکل من اصلا اونجا نبود
گفتم یک property که هنوز تعریف نشده رو می شه توی فایل index.php صدا زد و خودش ایجادش می کنه
توی پست دوم توضیخ دادم که این به خاطر script ی بودن زبان php هست، پس اون مشکل رفع شد
حالا می شه کاری کرد که php به متغیر های تعریف نشده errبده؟
از کد زیر استفاده کردم ولی بازم هیچ errی به متغیرهای تعریف نشده نداد!

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);


بازم به خاطر توجهتون ممنون

linuxUser
جمعه 18 اسفند 1391, 12:10 عصر
من متوجه سئوالتون شدم.
توی تابع __call گفته شده اگه هر تابع صدا زده شده که 3 حرف اول اسمش get و یا set بود (مثل setFirstName و getFirstName) چه کاری باید انجام بشه
اگه ساختار switch داخل این تابع نگاه کنید مشخص هست و خوب طبیعتا نیازی به تعریف یه تابع به اون اسم نیست
حالا اگه می خواید این طوری نباشه و فقط یه سری property های از قبل تعریف شده برای آبجکت فراخوانی کرد؛ خوب ساختار switch عوض کنید و یا قبلش یه شرط if بذارید به این صورت:


if($name != "getFirstName && $name != "setFirstName"")
return;

mojtaba.baghban
جمعه 18 اسفند 1391, 12:40 عصر
حالا ببنیند من property به نام firstName رو اصلا داخل کلاس User تعریف نکردم، ولی وقتی توی index.php استفاده می کنم ازش بدون هیچ موردی مقدار می گیره و مقدارشو می تونم برگردونم.
تا جایی که من فهمیدم وقتی کلاس توابع جادویی set و get رو نداشته باشه همینطور که شما گفتید رفتار می‌کنه و این هیچ مشکلی بوجود نمیاره حالا اگه واقعا می‌خوای اگه خاصیتی وجود نداشته باشه php بیاد error بده شما توابع جادویی get و set را با بدنه خالی تعریف کن.

desatir7316
جمعه 18 اسفند 1391, 12:41 عصر
آخه من کاری کردم که set , get رو به صورت dynamic داشته باشم تا برای هر property نیام set,get بنویسم
در کل می شه کاری کرد که php به متغیر های از پیش تعریف نشده ارور بگیره؟

desatir7316
جمعه 18 اسفند 1391, 12:48 عصر
تا جایی که من فهمیدم وقتی کلاس توابع جادویی set و get رو نداشته باشه همینطور که شما گفتید رفتار می‌کنه و این هیچ مشکلی بوجود نمیاره حالا اگه واقعا می‌خوای اگه خاصیتی وجود نداشته باشه php بیاد error بده شما توابع جادویی get و set را با بدنه خالی تعریف کن.


هیچ اروری نداد ولی دیگه به لیست property ها اضافه نشد.
ممنون
خیلی بهتر شد

desatir7316
جمعه 18 اسفند 1391, 13:06 عصر
سلام
دوستان مشکل با استفاده از Exception ها حل شد!
از همتون ممنون



public function __call($name, $args){
$methodName = substr($name, 0, 3);
$propertyName = strtolower($name[3]) . substr($name, 4);

switch($methodName){
case 'set':
if(count($args) == 1){
$this->__set($propertyName, $args[0]);
}else{
throw new \Exception ("default set func need one arg");
}//end of if statement
break;

case 'get':
return $this->__get($propertyName);
break;

default:
throw new \Exception("we only have set and get funcs");
break;
}//end of switch statement
}//end of fucntion __call

public function __set($name, $value) {
if (property_exists($this, $name)){
$this->$name = $value;
}else{
throw new \Exception ("$name does not exists in $this class");
}//end of if else statement
}// end of magic function __set();

public function __get($name) {
if(property_exists($this, $name)){
return $this->$name;
}else{
throw new \Exception ("$name does not exists in $this class");
}//end of if else statement
}//end of magic function __get();

mojtaba.baghban
جمعه 18 اسفند 1391, 14:17 عصر
فقط توجه کن که تابع property_exist اگه یه خاصیتی خصوصی هم باشه true برمی‌گردونه و با این get و set ای که تعریف کردی میشه خارج از کلاس به همه‌ی خاصیت‌های خصوصی کلاس هم دسترسی داشت.

desatir7316
جمعه 18 اسفند 1391, 14:29 عصر
فقط توجه کن که تابع property_exist اگه یه خاصیتی خصوصی هم باشه true برمی‌گردونه و با این get و set ای که تعریف کردی میشه خارج از کلاس به همه‌ی خاصیت‌های خصوصی کلاس هم دسترسی داشت.

ممنون
خوب دوست عزیز set, get برای دسترسی به خصوصیت های خصوصی یک کلاسه دیگه!
مگه غیر از اینه؟
حالا توی این کد درسته به همه همه خصوصیت ها می شه دسترسی داشت، که اگه طراح کلاس نخواست این مورد رو می تونه با دستورات شرطی این موضوع رو کنترل کنه، مگه اینکه راه بهتری وجود داشته باشه که ممنون می شم دوستان راهنمایی کنن

mojtaba.baghban
جمعه 18 اسفند 1391, 15:00 عصر
خوب دوست عزیز set, get برای دسترسی به خصوصیت های خصوصی یک کلاسه دیگه!
set, get برای دسترسی به خصوصیت هایی از یک کلاسه که وجود ندارند مانند خصوصیت‌های خصوصی و محافظت شده که بیرون از کلاس میشه گفت وجود ندارن و اونایی که کلا وجود ندارن.
اگه با این روش می‌خوای به خصوصیت‌های خصوصی کلاس دسترسی داشته باشی خوب چه کاریه از همون اول عمومی تعریفش کن

desatir7316
جمعه 18 اسفند 1391, 16:44 عصر
set, get برای دسترسی به خصوصیت هایی از یک کلاسه که وجود ندارند


یعنی چی وجود ندارن؟
یه نمونه مثال میاری لطفا؟
تا جایی که من میدونم خصوصیات مورد نیاز رو باید از اول تعریف کرد.

mojtaba.baghban
جمعه 18 اسفند 1391, 20:04 عصر
یعنی چی وجود ندارن؟
یه نمونه مثال میاری لطفا؟
تا جایی که من میدونم خصوصیات مورد نیاز رو باید از اول تعریف کرد.

بهتر بود می‌گفتم واسه هندل کردن خصوصیاتی هستند که یا وجود ندارند یا اینکه نمیشه بهشون دسترسی داشت دقیقا مثل تابع جادویی call که واسه هندل کردن متدهایی هست که یا جود ندارند یا اینکه نمیشه بهشون دسترسی داشت. مثل همین کاری که خودتون کردین یعنی تابعی به نام مثلا settext تو کلاس شما وجود نداره ولی وقتی با یه آبجکتی از این کلاس متد settext رو فراخوانی می‌کنید بدون error طبق روالی که call تعریف کرده مدیریت میشه.