بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

کنترل وجود یک متد در کلاس

مدیریت گفتگو
Alireza 10 سال پیش
آخرین تغییر: 10 سال پیش

سلام چجوری میتونم تو شرط چک کنم که آیا متدی در کلاس هست یا خیر و اگر نیست پیغام مناسب بده؟

نظرات

Alireza 10 سال پیش
اینو قبلا زدم ولی خطا میده
محسن موحد 10 سال پیش
کدتو بذار تا متوجه بشم چه خطایی داره

پاسخ‌ها 5

Alireza 10 سال پیش

میخوام در کد زیر بگم اگه کلاسی پیدا شد ولی متدی که در url وارد شد پیدا نشد پیغام مناسب بده

در کد زیر باید چجوری بگم؟

و همینطور میکنم کنترل کنم که اگه پارامتری در url صدا زده شد و در متد نبود پیغام مناسب براش چاپ شه

ممنون میشم راهنمایی کنید

 $controllerClassName = ucfirst($controller) . 'Controller';
$controllerInctanse = new $controllerClassName();
call_user_func_array(array($controllerInctanse, $method), $params);

نظرات

محسن موحد 10 سال پیش

$controllerClassName = ucfirst($controller).'Controller';
// require_once controllerFile
$controllerInstance = new$controllerClassName();
if(!method_exists($controllerInstance, $method))
throw new Exception("Action '{$method}' not found in '{$controller}' controller.");

نظرات

Alireza 10 سال پیش
ممنون ولی بدردم نخورد . یعنی درست نشد
Alireza 10 سال پیش
اینم بگم با auto load کلاس ها لود شده دیگه نمیخوا require کنم
محسن موحد 10 سال پیش
دستور که همین method_exists هست! باید ببینید اصلا کلاس لود میشه؟ خطا تولید میکنه؟ اگر خطا تولید میکنه چه خطایی؟ باید ایراد رو از اسکریپتتون پیدا کنید.
Alireza 10 سال پیش
ببینین من وقتی تو url میزنم user/login میره و فایل رو اجرا میکنه و هیچ مشکلی هم ندارم ولی وقتی میزنم مثلا user/wgfewuigfui میگه در کلاس user همچین متدی پیدا نکرده . درواقع من دارم انواع خطا در routing رو کنترل میکنم
محسن موحد 10 سال پیش
این دستوری که من گفتم هم داره همین کارو میکنه! و اگر متدی وجود نداشت اکسپشن تولید میکنه. غیر از اینه؟
Alireza 10 سال پیش
آقا دمت گرم حل شد - مشکل نوشتاری رودcontrollerInstance رو نوشته بودم controllerInstanse
Alireza 10 سال پیش
ممنون از کمکت
Alireza 10 سال پیش

آقا یه سوال دیگه حالا یه لول رفتم بالا تر میخوام چک کنم که اگه متد پیدا شد ولی همچین پارامتری توش نیست باید از چه function اده کنم؟

 

 

یجور پارامتر های یه متد رو بررسی کنم

نظرات

محسن موحد 10 سال پیش

// This will create an object that is the definition of your object
$f = new ReflectionMethod($instance_of_object, $method_name);
$args = array();

// Loop through params
foreach ($f->getParameters() as $param)
{
    // Check if parameters is sent through POST and if it is optional or not
    if (!isset($_POST[$param->name]) && !$param->isOptional())
        throw new Exception("You did not provide a value for all parameters");

    if (isset($_POST[$param->name]))
        $args[] = $_POST[$param->name];

    if ($param->name == 'args')
        $args[] = $_POST;
}

$result = call_user_func_array(array($instance_of_object, $method_name), $args);

بجای $_POST میتونی از متغیر params استفاده کنی که قبلا پارامترهارو در اون ریختی.
پارامترهایی که مقدار اولیه دارن ، isOptional مقدار true برمیگردونه و اگر مقار اولیه نداشته باشن ، پس با توجه به کد بالا ، باید حتما مقداری ارسال شده باشه.

نظرات

Alireza 10 سال پیش
میشه یکم درباره اسن سورس توضیح بدید؟
محسن موحد 10 سال پیش
با استفاده از Reflection اطلاعاتی از قبلی پراپرتی ها و متد ها و ... از آبجکت میتونیم بگیریم. کلاس Reflection متدهای مختلفی داره که میتونی از سایت مرجع ببینی. اما اینجا براساس نیاز آبجکتی از ReflectionMethod ساختیم و متد getParameters رو اجرا کردیم. این متد رو var_dump یا print_r بگیر تا ببینی به چی اشاره میکنه! $instance_of_object اشاره به کلاس کنترلر میکنه که در کد شما ControllerInstance هست. داخل حلقه هم بررسی وجود پارامترهای اجباریست که اگر وجود داشتن در آرایه ای قرار بگیرن و اگر یکی از پارامتر های لازم وجود نداشت ، خطا تولید بشه.
reza piry ghadim 10 سال پیش

با سلام .

پاسخ های آقا محسن واقعا کامل و عالی بود خودمم یاداشت کردم روش های ایشون رو ولی یه روشی هم وجود داره که خودم زیاد استفاده کردم . خیلی هم راحته :)

public function __call($name, $arguments){
// echo "this page << ". $name. " >> note find in website .";

//البته اطلاعات name , arguments رو استفاده کنی که و بعد کاربر رو به صفحه 404 بفرستید


View::adminRenderPartial("/404/404.php");


}

تابع __call یکی از توابع خاص php هست که اگه متدی در کلاس شما پیدا نشه این متد فراخوانی میشه و دو تاپارامتر $name و $arguments داره که $name همون اسم متدی هست که کاربر شما فراخوانی کرده و $arguments هم پارامتر هایی هست که برای متد وارد شده است که یه آرایه هست .

 

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .