مبحث امروز که در سایت GoYii به آن می پردازیم توابع مربوط به کلاس ها می باشد .
توابع مرتبط با کلاس ها
تابع زیر برای بررسی کلاس هایی که قبلا ایجاد شده اند به کار میرود
به این معنی که آیا کلاس وجود دارد یا نه
class_exists(“GoYii”)
خروجی
true or 1
در صورتی که وجود نداشته باشد خالی بر میگرداند
/* * ******************************** */
تابع بعدی نمایش کلاس های لود شده را نمایش میدهد.
کلیه ی کلاس ها را در قالب یک آرایه نمایش می دهد
get_declared_classes()
بررسی وجود پروپرتی یا متد در کلاس
در صورت وجود فقط true بر میگرداند
لیست کامل توابع مربوط به کلاس را می توانید در سایت اصلی ببینید. اینجا
یه مجیک متد دیگه ای هم وجود داره که به شما کمک میکنه هر متدیو اورلود کنین.
این قابلیت توی پی اچ پی ۵ هست
__call()
این متد به شما این امکانو میده که اگه پس از ایجاد نمونه ای از شی یه متدیو فراخونی کردین که نبود در کلاس اونو ایجاد میکنه واستون
این متد دوتا آرگومان میکیره
اولی میشه اسم متد
دومی میشه آرگومان هاش
بیشتر برای مدیریت اررور ها استفاده میشه این متد
برنامه نویسی شی گرا php
خوب برای حل کردن( مشکل قبلی) از متد های جادویی استفاده میکنیم
یکی ازین مجیک متد ها کارش اینه که گت و سترا به صورت اتومات انجام میده
خوب اونا
__set()
__get()
هستن
مثال:
اکسسور متد AccessorMethods
متد های ساده ای هستن که امکان گت یا ست کردن مقدار توی هر کلاسی را فراهم میکنه.
بهترین راه برای دسترسی به پروپرتی های یک کلاس , بدون دسترسیه مستقیم به اون متد ها, همین اکسسور متد ها هستند.
اککسور متد ها دو نوع دارند.
گتتر getter = خواندن مقادیر از پروپرتی های یک کلاس
ستتر setter = ست کردن مقدار برای پروپرتی های یک کلاس
قوانین نوشتن اککسور
برای مقدار دهی و مقدار خوانی باید در ابتدای متد از set or get استفاده کرد و بعد با حرف بزرگ شروع کرد
نکته ی مهم
برای دسترسی به پروپرتی ها استفاده میشود
برای استفاده از ستتر و گتتر پروپرتی ها پرایویت هستند
این روش خوبه اما نه برای تعداد زیاد.
فرض کنین صد پروپرتی داریم
اگر بخوایم برای همشون ازین روش استفاده کنیم باید صد گتتر و صد ستتر استفاده کنیم
برای یادگیری این موضوع به مبحث بعدی توجه کنین
آموزش برنامه نویسی شی گرا php oop
کلمه کلیدی استاتیک خیلی مهم در مبحث شی گرایی است.
متد ها و پروپرتی های استاتیک نقش حیاتی ای در طراحی نرم افزار و دیساین پترن بازی میکنن. (design patern)
هنگامی که شما میخواین از شی ای استفاده کنین.
نمونه ای از آن را ایجاد میکنین. $a=new class();
در غیر این صورت شما نمی توانید به آن شی دسترسی پیدا کنین.
اما برای متد ها و پروپرتی هایی که استاتیک هستن راه دیگه ای وجود داره
شما به متد ها و پروپرتی هایی که به صورت استاتیک تعریف شده اند می توانید به صورت مستقیم دسترسی داشته باشین بدون اینکه نمونه ای از اون کلاس ایجاد کنین
استاتیک ها مانند گلوبال ها هستند.
علاوه بر این متد ها یا پروپرتی های استاتیک میتونن آخرین وضعیتی که دریافت کردن و اختصاص یافتنو در خود نگه دارند.
استاتیک ها فعالیت های ویژه ای انجام میدن.
همچنین آبجکت های ویژه ای
در مباحث دیساین پترن استفاده میشن
مثال
برای فراخوانی متد یا پروپرتی استاتیک بیرون از کلاس از نام کلاس استفاده میشه به علاوه دو نقطه(classs::)
در داخل کلاس اگر متد یا پروپرتی ای که استاتیک هستو بخواین فراخوانی کنین از سلف دونقطه استفاده میشه(self::)
نباید همیشه از استاتیک استفاده کرد.
برای درک بهتر به مثال های زیر توجه کنین:
مثال اول:
class DBManager {
public static function getMySQLDriver() {
//instantiate a new MySQL Driver object and return
}
public static function getPostgreSQLDriver() {
//instantiate a new PostgreSQL Driver object and return
}
public static function getSQLiteDriver() {
//instantiate a new MySQL Driver object and return
}
}
$dbdriver = DBManager::getMySQLDriver();
مثال دوم:
class StaticTester {
private static $id = 0;
function __construct() {
self::$id +=1;
}
public static function checkIdFromStaticMehod() {
echo "Current Id From Static Method is " . self::$id . "
";
}
public function checkIdFromNonStaticMethod() {
echo "Current Id From Non Static Method is " . self::$id . "
";
}
}
$st1 = new StaticTester(); // ابتدا کانستراکتور فراخوانی میشود سپس آیدی یدونه اضافه میشه
StaticTester::checkIdFromStaticMehod(); //id=1
$st2 = new StaticTester();
$st1->checkIdFromNonStaticMethod(); //id=2
$st1->checkIdFromStaticMehod(); //id=2
$st2->checkIdFromNonStaticMethod(); //id=2
$st3 = new StaticTester();
StaticTester::checkIdFromStaticMehod(); //id=3
.htaccess در root Options +FollowSymlinks RewriteEngine On # deal with admin first RewriteCond %{REQUEST_URI} ^/vaymand/(admin) RewriteRule ^admin/assets/(.*)$ backend/web/assets/$1 [L] RewriteRule ^admin/css/(.*)$ backend/web/css/$1 [L] RewriteCond %{REQUEST_URI} !^/vaymand/backend/web/(assets|css)/ RewriteCond %{REQUEST_URI} ^/vaymand/(admin) RewriteRule ^.*$ backend/web/index.php [L] RewriteCond %{REQUEST_URI} ^/vaymand/(assets|css|uploads|vaymandshop) RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L] RewriteRule ^css/(.*)$ frontend/web/css/$1 [L] RewriteRule ^uploads/(.*)$ frontend/web/uploads/$1 [L] #RewriteRule ^uploads/advertise(.*)$ frontend/web/uploads/advertise/$1 [L] RewriteRule ^vaymandshop/(.*)$ frontend/web/vaymandshop/$1 [L] RewriteCond %{REQUEST_URI} !^/vaymand/(frontend|backend)/web/(assets|css)/ RewriteCond %{REQUEST_URI} !index.php RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ frontend/web/index.php .htaccess در frontend فولدر web RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?/$1 [L] .htaccess در backendفولدر web RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?/$1 [L] در فولدر common و در فولدر components Request.php namespace common\components; class Request extends \yii\web\Request { public $web; public $adminUrl; public function getBaseUrl(){ return str_replace($this->web, "", parent::getBaseUrl()) . $this->adminUrl; } public function resolvePathInfo(){ if($this->getUrl() === $this->adminUrl){ return ""; }else{ return parent::resolvePathInfo(); } } } تنظیمات main.php در frontend use \yii\web\Request; return [ 'request' => [ 'class' => 'common\components\Request', 'web' => '/frontend/web' ], 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, ], ] تنظیمات main.php در backend use \yii\web\Request; return [ 'request' => [ 'class' => 'common\components\Request', 'web' => '/backend/web', 'adminUrl' => '/admin' ], 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, ], ]
تدریس خصوصی برنامه نویسی به زبان PHP برای sort کردن اطلاعات در actionindex در کنترلر به روش زیر عمل می کنیم: public function actionIndex() { $searchModel = new BookSearch( ); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); $dataProvider->setSort([ 'defaultOrder' => ['status' => SORT_ASC] ]); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); }
تدریس خصوصی برنامه نویسی به زبان PHP
<ul>
<ol>
ابسترکت تقریبا شبیه اینتر فیس هست
با این تفاوت که متد ها دارای بادی هستند.
</ol>
<ol>
ابسترکت ها بر عکس اینترفیس ها که implements میشدن.
extend میشن
</ol>
<ol>
نکته زمانی که کلاسی را ابسترکت میکنین نمیتونین از final استفاده کنین.
چون ابسترکت اکستند میشه و final مانع اکستند شدنه
</ol>
<ol>
شما نمیتوانید از کلاسی که ابسترکت کردین نمونه ایجاد کنید
</ol>
<ol>
در ابسترکت شما نمیتوانید از مودیفایر پرایویت و پروتکتد استفاده کنین.
</ol>
</ul>
مثال :
<code>
interface DBDriver {
public function connect();
public function execute($sql);
}
abstract class ReportGenerator {
public function generateReport($resultArray) {
//write code to process the multidimensional result array and
//generate HTML Report
}
}
</code>
<ul>
<ol>
همونطور که شما میتونین یه کلاس ابسترکت کنین
میتونین یه متد نیز ابسترکت کنین
</ol>
<ol>
با این تفاوت که هر زمان که متدیو ابسترکت میکنین
اگر کلاسی از اون کلاس ارث برد.
حتما باید اون متدی که ابسترکت شدرو OVERRIDEکنه
</ol>
</ul>
نام پیش فرض پروژه ها در yii2 هم در ورژن بیسیک و هم ادونس "My Application" می باشد .
برای تغییر نام پیش فرض کافی است در main.php یا web.php کد زیر را قرار دهید :
<code>
$config = [
'timeZone' => 'Asia/Tehran',
'language' => 'fa_IR',
'id' => 'basic',
'name'=>'طبشهر',
]
</code>
برای دسترسی به آن نیز از Yii::$app->name استفاده می کنیم
اینترفیس ها یک نوع پولیمورفیسم هستند. اینترفیس ها کلاس های خالی ای هستند که فقط شامل متد ها میشن,یعنی فقط متد در اون ها تعریف میکنیم-البته بدون بادی. هر کلاسی هم که از این اینترفیس ما استفاده کنه در اصطلاح ایمپلیمنت کنه حتما باید اون متد هارو استفاده کنه. در غیر این صورت ارور مواجه میشه. اینترفیس ها چیزی نیستند جز یه سری استرینگ که کمک میکنه که کلاس هایی که ایمپلیمنت شدن از اونا استفاده کنند. هر کلاسی میتونه از اینترفیس ها استفاده کنه با استفاده از این کلمه کلیدی implements در اینتر فیس شما فقط متد تعریف میکنین بدون بادی. مثال interface DBDriver { public function connect(); public function execute($sql); }
نحوه ی اشتباه class MySQLDriver implements DBDriver { }
نحوه ی اشتباه class MySQLDriver1 implements DBDriver { public function connect() { //connect to database } public function execute() { //execute the query and output result } }
نحوه ی صحیح class MySQLDriver2 implements DBDriver { public function connect() { //connect to database } public function execute($query) { //execute the query and output result } }
تعداد صفحات : 20
آموزش مرحله به مرحله فریم ورک Yii