راکت
علیرضا
علیرضا
توسط علیرضا مطرح شد
حل
12 پاسخ

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

سلام من وقتی از 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;
    }
}

?>```
اگه میشه کمی در مورد مشکل هم توضیح بدین که یاد بگیرم

ثبت پرسش جدید
علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
0

ببینید کامپوزر یه قابلیت اصلی داره به نام 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.bayat7 سال پیشمطرح شد
0

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

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


علیرضا
علیرضا
تخصص :فرانت اند وب
@sep287 سال پیشمطرح شد
0

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


Reza Amini
Reza Amini
تخصص :PHP/Laravel
@rezi7 سال پیشمطرح شد
0

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


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
0

Error: Class 'der\PDO' not found

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

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

composer dump-autoload

Reza Amini
Reza Amini
تخصص :PHP/Laravel
@rezi7 سال پیشمطرح شد
0

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


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
0

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


علیرضا
علیرضا
تخصص :فرانت اند وب
@sep287 سال پیشمطرح شد
0

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


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
0

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

composer init

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

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },

علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
0

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


علیرضا
علیرضا
تخصص :فرانت اند وب
@sep287 سال پیشمطرح شد
0

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


Reza Amini
Reza Amini
تخصص :PHP/Laravel
@rezi7 سال پیشمطرح شد
0

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

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

علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat7 سال پیشمطرح شد
0

ببینید کامپوزر یه قابلیت اصلی داره به نام 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 هم همین‌طور


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

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