راکت
حل شده

ارور ویک مشکل در استفاده از namespace ها

12 پاسخ

سلام من وقتی از namespace ها استفاده می کنم با ارور زیر مواجه میشم


( ! ) Error: Class 'der\PDO' not found in C:\xampp\htdocs\learn php\template\admin\clasess\db.php on line 22```
اینم کد های فایل db.php
```<?php
namespace der;

class db{
    private $pdo;
    private $tbl;
    private $user;
    private $password;
    private $server;
    private $dbname;
public function __construct($server='localhost',$dbname='tcode',$user='root',$password='')
{
    $this->dbname = $dbname;
    $this->server = $server;
    $this->password = $password;
    $this->user = $user;
    $this->connect();
}
public  function connect(){

    try{
        return $this->pdo=new PDO("mysql:host={$this->server};dbname={$this->dbname}","root",'');
    }catch(Exception $e){
        echo '<h1>مشکلی در اتصال به دیتابیس وجود دارد</h1>';
    }

}
    public function setTbl($tbl){
        $this->tbl=$tbl;
    }
}

?>```
اگه میشه کمی در مورد مشکل هم توضیح بدین که یاد بگیرم
علیرضا
علیرضا
@sep28
ثبت پرسش جدید

پاسخ‌ها

12
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بهترین پاسخ

ببینید کامپوزر یه قابلیت اصلی داره به نام autoload که میاد تمام کلاس های تحت نیم اسپیس رو برای شما به صورت خودکار لود میکنه.
از اونجایی که شما از کامپوزر استفاده نمیکنید، روبرو شدن با خطای "Class 'der\PDO' not found" بدیهیه.
چون نمیتونه کلاس رو پیدا کنه.
در چنین حالتی باید یه تابع ساده شبیه زیر داشته باشی که این کار رو بکنه:

function __autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    // $fileName .= $className . '.php'; //sometimes you need a custom structure
    //require_once "library/class.php"; //or include a class manually
    require $fileName;

}

اما توجه داشته باشید، که این روش گاهی هم ممکنه با خطا روبرو بشه. راه‌کار اصلی استفاده از Composer هست.
در دنیای مدرن برنامه‌نویسی PHP استفاده از Composer لازم و حیاتیه. میشه گفت تمام فریم‌ورک‌ها ازش استفاده میکنند و تمام پکیج های PHP هم همین‌طور

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

درود. نیم اسپیس رو می‌تونید مثل ساختار فولدرها در نظر بگیرید... تصور کنید شما ۲ تا فایل App.php دارید در فولدرهای مختلف.

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

علیرضا
علیرضا
@sep28

تخصص: فرانت اند وب

@ali.bayat
سلام ببخشید منظور منو اشتباه متوجه شدین
من از namespace استفاده میکنم ولی ارور میده نمیدونم چرا؟ارورش هم ذکر کردم

شاید پاسخ شما همین‌جا باشد

Reza Amini
Reza Amini
@rezi

تخصص: PHP/Laravel

از اینکلود یا ریکوایر استفاده میکنید یا PSR ها و کامپوزر ؟

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

Error: Class 'der\PDO' not found

یا جایی در واردکردن نیم اسپیس ها اشتباهی رخ داده و یا تنظیمات composer.json بدرستی سِت نشدند.

همچنین اگر نیم اسپیس رو در composer.json تغییر بدید باید از دستور زیر هم استفاده کنید

composer dump-autoload
Reza Amini
Reza Amini
@rezi

تخصص: PHP/Laravel

@ali.bayat
اقای بیات ممکنه کلا از کامپوزر استفاده نکرده باشن چون ذکر نکردن از چی استفاده کردن و با این ارور مواجه شدن

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

@rezi
در اون صورت که علت ارور ها هم میتونه همون باشه

علیرضا
علیرضا
@sep28

تخصص: فرانت اند وب

rezi@
@ali.bayat
بصورت دستی include زدم

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

composer init

یه سری سوال میپرسه و یه فایل composer.json درست میکنه. سپس در قسمت autoload و بعدش PSR-4 باید نیم اسپیس رو اضافه کنید.

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بعد از هر تغییراتی در فایل کامپوزر باید از dump-autoload هم استفاده کنیدو موفق باشید

علیرضا
علیرضا
@sep28

تخصص: فرانت اند وب

@ali.bayat
من میخام بدون کامپیوسر استفاده کنم فعلا ، چرا ارور میده؟

Reza Amini
Reza Amini
@rezi

تخصص: PHP/Laravel

@paressep28
نباید اروری بده در اصل شما اینکلود کن
و به این صورت آبجکتی از اون کلس ایجاد کن

include 'db.php';
$db = new der\db();

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام