🚀 تخفیف ۳۵٪ + ۳.۵ میلیون هدیه! برنامه‌نویسی رو الان شروع کن - فقط امروز!
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۰ سینا علیزاده
تمرین فراخوانی __callstatic
جامعه پی اچ پی ایجاد شده در ۱۷ تیر ۱۴۰۲

استاد سلام وقتتون بخیر

استاد این کد من هستش اما نمیدونم چرا با گذاشتن تابع file_exists از کار میوفته

    public static function __callStatic(string $method, $arguments):string
    {
        $url = $_ENV['BASE_URL'] ;
        $file = $url . "assets/" . $method . "/" . $arguments[0];
        return (file_exists($file)) ? $file : null ;
    }

این هم ارور دریافتی :

Fatal error: Uncaught TypeError: App\\Utilities\\Asset::__callStatic(): Return value must be of type string, null returned in C:\\xampp\\htdocs\\7learn.msa\\7micro\\App\\Utilities\\Asset.php:15 Stack trace: #0 C:\\xampp\\htdocs\\7learn.msa\\7micro\\index.php(13): App\\Utilities\\Asset::__callStatic('css', Array) #1 {main} thrown in C:\\xampp\\htdocs\\7learn.msa\\7micro\\App\\Utilities\\Asset.php on line 15

سلام سینا جان، Return Type تابع callStatic رو گذاشتید string ولی داخل تابع در صورتی که فایل وجود نداشته باشه null ریترن میشه، خب اینجا همخوانی با ریترن تایپ وجود نداره و باعث خطا میشه.

برای حل کردن این موضوع باید یا ریترن تایپ رو به شکل زیر تغییر بدید یا ریترن داخل تابع تون رو تغییر بدید که بصورت یه رشته خالی برگردونه.

    // Change return type to ?string for nullable string
    public static function __callStatic(string $method, $arguments): ?string
    {
        $url = $_ENV['BASE_URL'] ;
        $file = $url . "assets/" . $method . "/" . $arguments[0];
        return (file_exists($file)) ? $file : null;
    }
    // OR
    public static function __callStatic(string $method, $arguments): string
    {
        $url = $_ENV['BASE_URL'] ;
        $file = $url . "assets/" . $method . "/" . $arguments[0];
        
        // Change null to empty string ''
        return (file_exists($file)) ? $file : '';
    }
صادق برزگر ۱۷ تیر ۱۴۰۲، ۰۵:۱۲

استاد اون برطرف شد ولی چرا با وجود اینکه $file وجود داره، مقدار برگشتی null عه

سینا علیزاده ۱۷ تیر ۱۴۰۲، ۰۵:۱۶

یه var_dump از متغییر file بگیرید ببینید خروجیش درسته یا ن

صادق برزگر ۱۷ تیر ۱۴۰۲، ۰۷:۲۱

string(45) "http://7learn.msa/7micro/assets/css/style.css"

سینا علیزاده ۱۷ تیر ۱۴۰۲، ۰۷:۲۴

بله استاد کاملا درسته

سینا علیزاده ۱۷ تیر ۱۴۰۲، ۰۷:۲۴

سینا جان، الان خروجی تون یه url هست در حالی که با فانکشن file_exists باید path یا همون مسیر فایل رو بهش بدید نه آدرسش توی مرورگر رو!

راه حلش یه همچین چیزی میشه:

    public static function __callStatic(string $method, $arguments): ?string
    {
        $url = $_ENV['BASE_URL'];
        $public = $_ENV['PUBLIC_PATH']; // public or root directory (where is assets folder?)
        $asset = "assets/{$method}/{$arguments[0]}";
        return (file_exists("{$public}/{$asset}")) ? $url . $asset : null;
    }
صادق برزگر ۱۷ تیر ۱۴۰۲، ۱۲:۳۱

استاد الان این کدم رو بخوام تغییر بدم که مثل اونی که بهم دادین کار کنه کجاشو باید درست کنم:


public static function __callStatic(string $method, $arguments): ?string
    {
        $url = $_ENV['BASE_URL'] ;
        $file = "assets/" . $method . "/" . $arguments[0];
        return (file_exists($file)) ? $url . $file : null ;
        // return (file_exists(BASE_PATH . $file)) ? $url . $file : null ;
    }

الان دیگه داخل شرطم مسیر فابل هست نه آدرس مرورگر.

سینا علیزاده ۱۷ تیر ۱۴۰۲، ۱۳:۰۱
public static function __callStatic(string $method, $arguments): ?string
    {
        $url = $_ENV['BASE_URL'] ;
        $file = "assets/" . $method . "/" . $arguments[0];
        return (file_exists(BASE_PATH ."/". $file)) ? $url . $file : null;
    }


صادق برزگر ۱۷ تیر ۱۴۰۲، ۱۳:۴۳

استاد بازم مقدار null برمیگردونه

سینا علیزاده ۱۸ تیر ۱۴۰۲، ۰۳:۰۱

مقدار $file اکو کنید و با مسیر فایل هاتون چک کنید اصلا فرمت ادرستون درست هست یا خیر، که اگر اشتباه بود مسیری که میدید براساس فولدربندی پروژتون باشه.

اگر بازهم نتونستید از فایل بندی پروژه در ادیتور اسکرین شات بذارید بهمراه مقدار اکو شده تا بررسی کنم.

بهترین پاسخ
محسن موحد ۱۸ تیر ۱۴۰۲، ۲۲:۴۴