توابع (Functions) در PHP
از جمله مباحثی که در اغلب زبان های برنامه نویسی به چشم می خورد مبحث توابع (Functions) است، برنامه نویسان همواره در پی یافتن سریعترین راه حل ها با کمترین کدنویسی و در عین حال رسیدن به مقصودشان به بهینه ترین شکل ممکن هستند و به همین خاطر است که به جای نوشتن چندین و چندباره دستورات، یک بار کدها را به صورت توابع تعریف کرده و بعد از آن در هر بار فراخوانی به تابع ورودی داده و خروجی مد نظرشان را دریافت می کنند، در واقع توابع نقش ماشین های تسهیل کننده را برای برنامه های مختلف بازی می کنند که به کمک آنها می توانیم یک سری از پردازش ها را چندین و چند بار داشته باشیم بدون اینکه بخواهیم برای هر پردازش کدها را جداگانه تعریف کنیم، با این مقدمه کوتاه می پردازیم به ادامه آموزش برنامه نویسی PHP با مبحث توابع (Functions).
تابع (Function) چیست و چه کاربردی دارد؟
در زبان های برنامه نویسی و از جمله در PHP توابع ماشین هایی با ساختار از قبل تعریف شده (بلاکی از کدها) هستند که معمولا با دریافت مقدار یا مقادیری به عنوان ورودی پردازش های مد نظر برنامه نویس را انجام داده و در نهایت حاصل این پردازش ها به عنوان خروجی در ادامه برنامه قابل استفاده است، به این دلیل به تابع "ماشین" می گوییم چون مانند یک دستگاه مواد خام را دریافت کرده و در نهایت محصول تولید می کند و به همین جهت روندهای تکراری با نوشتن یک تابع چندین و چند بار در برنامه قابل انجام است، همچنین به این دلیل گفتیم "معمولا با دریافت مقدار یا مقادیر ورودی" چون در دنیای برنامه نویسی توابع را بدون مقدار ورودی هم می توانیم استفاده کنیم و حتی برخی توابع هیچ مقدار ورودی یا خروجی ندارند و صرفا تغییراتی در متغیرها و آبجکت ها ایجاد می کنند که همه اینها بستگی به نیاز برنامه ما دارد.
انواع مختلف تابع در PHP
در یک تقسیم بندی کلی توابع در PHP به دو صورت زیر قابل تفکیک هستند:
- توابع درونی یا از پیش تعریف شده (Predefined یا Internal (built-in) functions).
- توابع سفارشی یا تعریف شده توسط کاربر (Custom یا User-defined functions).
منظور از توابع درونی مواردی هستند که به صورت ذاتی در مفسر PHP وجود دارند و به کمک آنها می توانیم بدون نوشتن کدهای اضافه با سرعت و سهولت بیشتری روند توسعه برنامه ها را پیش ببریم، به طور مثال تابع str_replace برای جایگزینی مقادیر رشته ای با هم، تابع is_numeric برای بررسی عدد بودن یک مقدار، تابع strtolower برای تبدیل حروف بزرگ انگلیسی به شکل حروف کوچک و موارد فراوانی از این دست که در مفسر PHP از قبل تعریف شده و به همراه هسته برنامه نصب می شوند.
علاوه بر توابع درونی این قابلیت در زبان PHP وجود دارد که تابع سفارشی و شخصی تعریف کنیم، توابع شخصی معمولا با هدف اجرای بلاکی از کدها به دفعات متعدد در قسمت های مختلف برنامه نوشته می شوند و با این کار روندهای مشابه با یک بار کدنویسی چندین و چند بار قابل تکرار هستند، برای نوشتن و استفاده از توابع سفارشی باید قواعد زبان PHP را رعایت کنیم.
در ادامه آموزش ابتدا توابع سفارشی را بررسی و سپس اشاره ای به توابع درونی PHP خواهیم کرد.
شیوه نگارش (Syntax) تعریف تابع در PHP
شیوه نگارش (Syntax) تعریف توابع در PHP شباهت زیادی به دیگر زبان پرکاربرد وب یعنی جاوا اسکریپت دارد، در PHP هم برای تعریف تابع از عبارت function با نمونه فرمت زیر استفاده می کنیم:
<?php
//تعریف تابع
function boldMyText($text){
$result = '<strong>' . $text . '</strong>';
return $result;
}
?>توضیح:- توابع در PHP با عبارت function و درج نام با شرایطی که در ادامه خواهیم گفت تعریف می شوند، در قسمت () آرگیومنت ها یا همان ورودی های تابع تنظیم می شود و قسمت {} بدنه اصلی و کدهایی که باید تابع اجرا کند را دربر می گیرد، در نهایت نیز معمولا حاصل فرآیند تابع با عبارت دستوری return برگردانده می شود.
- استفاده از آرگیومنت و return در توابع اختیاری است، به عبارتی می توانیم توابعی بدون ورودی یا خروجی داشته باشیم (به فرض تابع صرفا مقدار یک متغیر یا آبجکت را در روند برنامه تغییر دهد).
قواعد نامگذاری توابع در PHP
مانند هر زبان برنامه نویسی PHP نیز از قواعد خاصی برای نامگذاری توابع پیروی می کند، در PHP نام توابعی که تعریف می کنیم می تواند در چارچوب Regex زیر عبارتی دلخواه شامل حروف و اعداد انگلیسی، کاراکتر زیرخط یا Underline "_" یا کاراکترهای non-ASCII (کاراکترهای خارج از استاندارد ASCII) باشد:
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$اطلاعات بیشتر در خصوص استاندارد ASCII:asciitable.comشروع نامگذاری تابع حتما باید با حروف یا کاراکتر _ باشد، جالب است که با توجه به پشتیبانی از یونیکد UTF-8 (عبارت زیر در دستور باقاعده بالا کاراکترهای non-ASCII را شامل می شود:)\x80-\xffاستفاده از نام و اعداد فارسی برای تابع در PHP ممکن است، در مجموع توصیه می کنیم برای سازگاری و خواناتر شدن کدها در نامگذاری عموما از کلمات با معنی به صورت تکی یا در ترکیب با سایر کلمات و اعداد انگلیسی استفاده کنیم، به طور مثال چند نام فرضی برای توابع:clean, changeUser, getNewResult, textType1, textType2, getParam_1, getParam_2انتخاب نام به صورت صرفا عددی (به فرض 01234) یا دارای کارکترهای خاص (به فرض ^ * #) مجاز نیست و در صورت استفاده خطای مشابه زیر را دریافت خواهیم کرد:Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting identifier (T_STRING) or '(' in ... .php on line 2فراخوانی توابع در PHP
برای اینکه توابع در کدها اثرگذار باشند حتما باید آنها را فراخوانی (Call) کنیم، فراخوانی توابع در کدهای PHP معمولا به صورت استفاده مستقیم و بی واسطه است با این حال به فراخور نیاز برنامه ها شیوه های دیگری نیز برای فراخوانی توابع وجود دارد که در ادامه بررسی می کنیم.
- فراخوانی تابع به صورت مستقیم
در این شیوه بسته به هدف یا خروجی که تابع بر می گرداند (رشته، عدد، مقادیر بولین و...) می توانیم از تابع به صورت مستقیم استفاده کنیم، به طور مثال نمونه کد زیر خروجی تابع را که یک رشته متنی است با دستور echo چاپ می کند:
<?php
//تعریف تابع
function boldMyText($text){
$result = '<strong>' . $text . '</strong>';
return $result;
}
//متغیر
$text = "این متن را برجسته کن";
//فراخوانی تابع
echo boldMyText($text);
?>با اجرای این نمونه کد در لوکال هاست یا سرور آنلاین مقادیر متغیر text به صورت برجسته شده با تگ strong در خروجی صفحه چاپ می شود.مثال دیگر از به کار بردن مستقیم تابع در PHP:
<?php
function checkOddEven($number){
if($number % 2 == 0){
return true;
}
return false;
}
if(checkOddEven(2)){
echo 'عدد زوج است';
} else {
echo 'عدد فرد است';
}
?>این تابع زوج یا فرد بودن عدد دریافتی را بررسی و مقادیر true یا false را به عنوان نتیجه برمی گرداند.- اختصاص تابع به متغیر و فراخوانی با واسطه
در این شیوه ابتدا تابع را به روال متداول تعریف می کنیم و سپس برای فراخوانی نام تابع را به متغیر نسبت داده و در ادامه ی کدها متغیر را با پارامترهای مد نظرمان فراخوانی می کنیم، مثال:
<?php
function myFuncName($arg_1, $arg_2){
if(!is_numeric($arg_1) || !is_numeric($arg_2)){
return false;
}
return $arg_1 + $arg_2;
}
$my_var = "myFuncName";
echo $my_var(2, 4);
?>خروجی نمونه کد بالا عدد 6 خواهد بود.- استفاده از تابع درونی call_user_func
شیوه دیگری که PHP برای فراخوانی توابع در اختیارمان قرار می دهد استفاده از متغیر و تابع درونی call_user_func است، به طور مثال:
<?php
function myFuncName($arg_1, $arg_2){
if(!is_numeric($arg_1) || !is_numeric($arg_2)){
return false;
}
return $arg_1 + $arg_2;
}
$var = call_user_func("myFuncName", 2, 4);
echo $var;
?>خروجی نمونه کد بالا عدد 6 خواهد بود.- استفاده از تابع eval (توصیه نمی شود)
این امکان در مفسر PHP وجود دارد که یک رشته را به صورت کدهای PHP پردازش و اجرا کنیم، برای این کار تابع درونی eval کاربرد دارد، مثال:
<?php
function myFuncName($arg_1, $arg_2){
if(!is_numeric($arg_1) || !is_numeric($arg_2)){
return false;
}
return $arg_1 + $arg_2;
}
$var = "echo myFuncName(2, 4);";
eval($var);
?>خروجی نمونه کد بالا عدد 6 خواهد بود.نکته: استفاده از تابع eval به لحاظ امنیت برنامه ممکن است با خطراتی همراه باشد و بخصوص اگر قرار است که ورودی از سمت کاربر در این تابع اجرا شود باید حتما قبلا رشته ارسالی کاملا اعتبارسنجی و ایمن سازی شود.
آرگیومنت (Argument) تابع
در برنامه نویسی با زبان PHP استفاده از توابع می تواند با و بدون ورودی باشد اما معمولا توابع را با یک یا چند ورودی (جدا شده با علامت کاما ",") تعریف و به این ورودی ها در اصطلاح آرگیومنت (Argument) می گوییم، در هنگام تعریف و فراخوانی تابع بسته به هدف و نوع پردازش های مد نظر آرگیومنت ها می توانند به یکی از صورت های زیر باشند:
- فراخوانی با مقدار (Call by Value)
این حالت شیوه پیش فرض استفاده از آرگیومنت برای توابع در PHP است، در این شیوه پارامتر یا پارامترهای مد نظر به صورت متغیر بین کاراکترهای () تعریف و در هنگام فراخوانی به صورت مستقیم یا به شکل متغیر مقداردهی می شوند، مثال:
<?php
function checkValueExist($value, $array){
if(in_array($value, $array)){
return true;
}
return false;
}
$array = Array('A', 'E', 'G');
$value = 'R';
if(checkValueExist($value, $array)){
echo 'مقدار ' . $value . ' در آرایه وجود دارد';
} else{
echo 'مقدار ' . $value . ' در آرایه وجود ندارد';
}
?>در این نمونه کد تابع فرضی checkValueExist با دو آرگیومنت تعریف شده است که پارامتر اول (value) می تواند یک رشته متنی و پارامتر دوم (array) یک آرایه باشد (در خصوص آرایه ها در مباحث آینده مفصل خواهیم گفت)، تابع مقادیر ورودی را دریافت کرده و وجود پارامتر اول را در آرایه دریافتی بررسی و در نهایت با مقادیر true یا false نتیجه را برمی گرداند و بر این مبنا می توانیم در دستور شرطی if تصمیم بگیریم که کدام قسمت از کدها اجرا شوند.- فراخوانی با ارجاع (Call by Reference)
در حالت معمول پردازش های صورت گرفته بر مقادیر ورودی در روند تابع روی متغیرهای بیرون از تابع تاثیری ندارند، به طور مثال متغیر فرضی a در نمونه کد زیر همیشه مقدار 5 را چاپ می کند:
<?php
function doIncrement($num){
return $num++;
}
$a = 5;
doIncrement($a);
echo $a;
?>اما با استفاده از کاراکتر & می توانیم این حالت را تغییر داده و اثر تابع را بر روی متغیر بیرون از آن داشته باشیم، مثال:<?php
function doIncrement(&$num){
return $num++;
}
$a = 5;
doIncrement($a);
echo $a;
?>خروجی این نمونه کد عدد 6 خواهد بود.به این شیوه تعریف آرگویمنت ها با استفاده از کاراکتر &، فراخوانی با ارجاع یا Call by Reference می گوییم.
- مقادیر پیش فرض آرگیومنت ها (Default argument values)
شکل دیگر استفاده از آرگیومنت ها برای توابع تعریف آنها با مقادیر پیش فرض است، به این صورت اگر تابع را بدون آرگیومنت فراخوانی کنیم مقادیر پیش فرض جایگزین آرگیومنت می شود، مثال:
<?php
function sayWelcome($user = "Admin"){
echo "Hi " . $user . ", Welcome to Control Panel!<br>";
}
sayWelcome();
sayWelcome("Manager");
?>در صورت اجرای نمونه کد بالا در لوکال یا سرور خروجی زیر چاپ خواهد شد:Hi Admin, Welcome to Control Panel!
Hi Manager, Welcome to Control Panel!گفتیم توابع را بدون return هم می توانیم استفاده کنیم.- لیست آرگیومنت ها با طول متغیر (Variable-length argument list)
شیوه جالب دیگر استفاده از آرگیومنت برای توابع که در PHP نسخه 5.6 و مابعد اضافه شده استفاده از عملگر سه نقطه (Splat یا Three dots Operator) و تنظیم ورودی به صورت لیست با طول متغیر است، در این شیوه تعداد آرگیومنت ها از قبل مشخص نیست و بسته به نیاز می تواند میزانی متغیر باشد، به طور مثال (کد صرفا در PHP نسخه 5.6 و مابعد قابل اجرا است):
<?php
function addNumbers(...$number){
$result = 0;
foreach($number as $key => $value){
$result += $value;
}
return $result;
}
echo addNumbers(1, 5, 6);
?>خروجی نمونه کد بالا عدد 12 خواهد بود.همان طور که مشخص است در این شیوه آرگیومنت به همراه کاراکتر سه نقطه تعریف شده و در تابع به شکل آرایه در حلقه foreach از آن استفاده کرده ایم، این شکل از استفاده از سه نقطه جهت دستیابی به مقادیر آرگیومنت را در اصطلح برنامه نویسی شیوه دسترسی به آرگیومنت های متغیر (Accessing Variable Arguments Method) می گوییم.
از سه نقطه در هنگام فراخوانی تابع هم می توانیم برای استخراج (Unpack) آرایه (یا متغیرهای Traversable یا Literal) و اختصاص به مقادیر آرگیومنت ها استفاده کنیم، البته در این حالت باید تعداد پارامترهای تابع مشخص باشد، مثال (کد صرفا در PHP نسخه 5.6 و مابعد قابل اجرا است):
<?php
function addNumbers($a, $b, $c){
$result = $a + $b + $c;
return $result;
}
$var = [1, 5, 6];
echo addNumbers(...$var);
?>خروجی این نمونه کد هم مقادیر 12 خواهد بود.به این شکل استفاده از سه نقطه جهت اختصاص مقادیر آرگیومنت ها را در اصطلاح برنامه نویسی شیوه مقداردهی به آرگیومنت های متغیر (Providing Variable Arguments Method) می گوییم.
نکته: مفاهیم Traversable یا Literal اصطلاحات تخصصی برنامه نویسی هستند که آموزش آنها در مرحله مقدماتی مورد نیاز نیست و در عمل هم شاید صرف این مفاهیم به خودی خود خیلی کاربردی نباشند، در همین حد بدانیم که یکی از کاربردهای کاراکتر سه نقطه می تواند با این نوع متغیرها باشد کافی است.
آخرین شکل استفاده از لیست آرگیومنت ها با طول متغیر شیوه استفاده با اشاره به نوع ورودی (Type hinted Variable Arguments Method) است، در این شیوه نام یک کلاس با فاصله قبل از کاراکتر ... قرار می گیرد و در این صورت ورودی ها الزاما باید نمونه (Instance) ای از آن کلاس باشند و در نهایت می توانیم به آبجکت های public آن کلاس در تابع دسترسی داشته باشیم، مثال:
<?php
class MyClass{
private $var_1 = 5;
private $var_2 = 8;
public $myInt;
function __construct($type){
switch($type){
case 'a':
$this->myInt = $this->var_1;
break;
case 'b':
$this->myInt = $this->var_2;
break;
}
}
}
function addNumbers(MyClass ...$number){
$result = 0;
foreach($number as $key => $value){
$result += $value->myInt;
}
return $result;
}
$a = new MyClass('a');
$b = new MyClass('b');
echo addNumbers($a, $b);
?>خروجی مثال بالا عدد 13 خواهد بود، همان طور که مشخص است آرگیومنت های تابع از فراخوانی کلاس MyClass با دو پارامتر a و b مقداردهی و در تابع از آبجکت myInt مقادیر دریافت شده اند.نکته: این شکل استفاده از آرگیومنت های توابع برای برنامه نویسی معمول کاربرد آنچنانی ندارد اما در برنامه نویسی پیشرفته و شی گراء ممکن است کاربردی باشد که جهت آشنایی بیشتر توضیح داده شد.
توابع درونی (Predefined یا Internal (built-in)) در PHP
در اغلب زبان های برنامه نویسی متدها و توابعی به صورت از قبل تعریف شده و آماده وجود دارد که به کمک آنها می توانیم روندهای معمول آن زبان را با سرعت و سهولت بیشتری انجام دهیم، PHP نیز از این قاعده مستثنی نیست و در هسته مفسر آن توابع درونی (Predefined یا Internal (built-in)) به تعداد خیلی زیادی جهت سرعت بخشیدن به روند کار کدنویسی از قبل تعریف شده و توسط برنامه نویسان قابل استفاده است، در لیست زیر سایت مرجع php.net این توابع و متدها را به ترتیب حروف الفبا به همراه توضیحاتی درج کرده است که مرور آنها جهت آشنایی کلی و مراجعات بعدی خالی از لطف نیست:
https://www.php.net/manual/en/indexes.functions.phpبرای آشنایی بیشتر در ادامه برخی توابع درونی پرکاربرد زبان PHP را به همراه نمونه کد بررسی می کنیم.- تابع strlen و mb_strlen
برای به دست آوردن طول رشته (تعداد کاراکتر) از تابع strlen استفاده می کنیم، حالت multi-byte این تابع برای کار با متون یونیکد مانند زبان فارسی (UTF-8) می تواند کاربرد داشته باشد، مثال:
<?php
$str = "text";
echo strlen($str);
?>خروجی مثال بالا عدد 4 خواهد بود.<?php
mb_internal_encoding("UTF-8");
$str = "متن";
echo mb_strlen($str);
?>خروجی مثال بالا عدد 3 خواهد بود.- تابع str_replace
برای جایگزینی یک مقدار رشته ای با مقادیر دیگر از تابع str_replace استفاده می کنیم، مثال:
<?php
$str = "PHP is so difficult to learn!";
echo str_replace('difficult', 'easy', $str);
?>خروجی نمونه کد بالا به صورت زیر خواهد بود:PHP is so easy to learn!- تابع trimبرای حذف فضای خالی از ابتدا و انتهای رشته از تابع trim استفاده می کنیم، مثال:
<?php
$str = " PHP ";
echo strlen($str);
$str = trim($str);
echo '<br>';
echo strlen($str);
?>خروجی مثال بالا به صورت زیر خواهد بود:5
3- تابع ceilبرای گرد کردن به بالای اعداد اعشاری به نزدیکترین عدد صحیح از تابع ceil استفاده می کنیم، مثال:
<?php
$num = 3.2;
echo ceil($num);
?>خروجی مثال بالا عدد 4 خواهد بود.floor و round دو تابع دیگر مشابه با عملکرد متفاوت در این زمینه هستند.
- تابع count
برای شمارش عناصر آرایه یا آبجکت می توانیم از تابع count استفاده کنیم، مثال:
<?php
$array = Array("a", "b");
$count = count($array);
if($count < 2){
echo "Error!";
} else {
echo "Ok! count array is: " . $count;
}
?>خروجی نمونه کد بالا به صورت زیر خواهد بود:Ok! count array is: 2تعداد توابع درونی PHP بسیار زیاد است و در اینجا صرفا جهت نمونه و آشنایی بیشتر چند مثال ذکر شد، اما آیا باید همه این توابع را به حافظه بسپاریم؟!جواب قطعا خیر خواهد بود، هیچ نیازی نیست لیست توابع را حفظ کنیم و چنین کاری عملا هم حداقل به راحتی ممکن نیست، کافی است در هر برنامه ای که می خواهیم بنویسیم توابع مرتبط با فرآیندهای آن برنامه را از طریق جستجو یا مراجعه به نمونه کدها و منابع مرجع پیدا، با کارکردشان آشنا شده و در نهایت در کدهایمان از آنها استفاده کنیم، البته برخی توابع PHP پرکاربرد و متداول هستند که به مرور و به صورت خودکار در ذهنمان حفظ می شوند.
دسته بندی: آموزش مقدماتی » PHP
برچسب ها: PHP
آرایه (Array) در برنامه نویسی PHP
دستورات شرطی (Conditional Statements) در PHP
توابع کار با آرایه در PHP - بخش دوم
عملگرها (Operators) در PHP
آموزش برنامه نویسی وب با PHP
دیدگاه
حسین
۱۲:۵۷ ۱۳۹۴/۱۰/۱۹
سلام من یه مشکلی دارم که نمیدونم چطوری مطرح کنم !
من یه حلقه foreach دارم که میخوام اطلاعاتش رو وارد دیتابیس کنم! چطوری باید اطلاعات foreach رو بگیرم ؟
مثلا نمیشه
من یه حلقه foreach دارم که میخوام اطلاعاتش رو وارد دیتابیس کنم! چطوری باید اطلاعات foreach رو بگیرم ؟
مثلا نمیشه
$id = foreachاینطوری بزنم! یه روشی معرفی کنید ممنون میشم :(حلقه foreach دستور و روشی برای کار با آرایه ها است و به خودی خود مقداری ندارد که بخواهید از آن استفاده کنید!، یعنی ابتدا باید مفهوم آرایه را در برنامه نویسی بدانید، سپس می توانید در حلقه، از کلید یا مقدار آرایه برای استفاده در پرس و جو استفاده کنید، لطفا به آموزش های مقدماتی آشنایی با آرایه و سپس کار با حلقه ها در PHP مراجعه کنید.
Matori73
۱۵:۰۹ ۱۳۹۴/۱۰/۱۴
درود !
من دو قطعه کد نوشتم که متاسفانه هیچکدومشون جواب ندادن، ممنون میشم راهنمایی بفرمایید :
کد اول :
من دو قطعه کد نوشتم که متاسفانه هیچکدومشون جواب ندادن، ممنون میشم راهنمایی بفرمایید :
کد اول :
<?php
$Url = $_SERVER['REQUEST_URI'];
$Url = explode("/",$Url);
$Page_Name = $Url[count($Url)-1];
if( $Page_Name == 'story' ){
echo '<meta name="description" content="'.substr($sk['story']['text'], 0, 200).'">';
} else {
echo '<meta name="description" content="'.$sk['config']['description'].'">';
}
?>کد دوم ؛<?php
$des1 = 1;
$des2 = 2;
$Url = $_SERVER['REQUEST_URI'];
$Url = explode("/",$Url);
$Page_Name = $Url[count($Url)-1];
if( $Page_Name == 'story' ){
echo '<meta name="description" content="'. $des1 .'">';
} else {
echo '<meta name="description" content="'. $des2 .'">';
}
?>تشکر ..کد اول خطای Syntax داشت و کد دوم به درستی مقدار متغیر را جایگزین نمی کرد (کدها اصلاح شدند!)، برای راحتی و دقت بیشتر بهتر است از برنامه هایی مانند Adobe Dreamweaver استفاده کنید.
سام
۱۸:۰۳ ۱۳۹۴/۰۸/۱۱
با سلام خدمت شما و ممنون از سایت خوبتون.
من میخوام بدونم که چطور میشه به یک ارگومانت در تابع چندین پارامتر ارسال کرد.
مثلا:
من این تابع را برای ارسال چند پارامتر نوشته ام میدونم اشتباه است و یا توابع زیادی برای این کار هستند اما میخوام خودم بنویسمش و نحوه کارش رو بدونم.
خوشحال میشم ایرادات این کد رو از نظر فنی هم بفرمایید.
این تابعی هست که من نوشتم:
یک مثال کامل رو خودتون راهنمایی کنید، البته بدون استفاده از توابع اماده.
خیلی ممنون.
من میخوام بدونم که چطور میشه به یک ارگومانت در تابع چندین پارامتر ارسال کرد.
مثلا:
من این تابع را برای ارسال چند پارامتر نوشته ام میدونم اشتباه است و یا توابع زیادی برای این کار هستند اما میخوام خودم بنویسمش و نحوه کارش رو بدونم.
خوشحال میشم ایرادات این کد رو از نظر فنی هم بفرمایید.
این تابعی هست که من نوشتم:
<?php
$con=mysqli_connect("localhost","root","","data");
function test($p){
$a=array($p);
for($i=0;$i<count($a);$i++){
return $a[$i];
}
}
if(isset($_POST["send"])){
$name=$_POST["user"];
$b="asiodjiiasi";
mysqli_query($con,"insert into user('name') values(".test("$name,$b").")");
echo "Insert";
}
?>
<form method="post">
<input type="text" name="user">
<input type="submit" name="send">
</form>میخوام پارامترها بعد از ارسال به این صورت باشند."test1","test"یعنی هر رشته را با کاما جدا هم کنه یعنی اگر کاربر اولی رو نوشت بعد کاما اضافه شه نه همه رو بخونه بعد کاما اضافه کنه. برای مثال میخواهم این تابع را برای استفاده در قسمت ارسال مقادیر value ها به دیتابیس استفاده کنم که تو قسمت insert تابع را فراخوانی کردم.یک مثال کامل رو خودتون راهنمایی کنید، البته بدون استفاده از توابع اماده.
خیلی ممنون.
در درجه اول باید ببینید ورودی (آرگیومنت) تابع شما یک مقدار ساده است یا یک آرایه، آنطور که از کدهای شما برداشت می شود، این ورودی یک آرایه است! البته در هنگام فراخوانی تابع ظاهرا دو آرگیومنت استفاده شده که صحیح نیست و باید هر دو در قالب یک آرایه تجمیع شوند! با فرض اینکه ورودی یک آرایه است، باید به تعداد کلیدها در حلقه گردش داشته باشید (که تا حدی این کار را انجام داده اید)، اما برای ایجاد خروجی داینامیک و استفاده از آن باید به Syntax دستورات دیتابیس توجه کنید، این مرحله نیاز به تست دقیق دارد که متاسفانه امکان تست کدها به جهت مرتبط به دیتابیس بودن مقدور نیست، اگر تمایل داشتید، کدهایتان را در یک سرور آنلاین پیاده سازی کنید و سپس اطلاع دهید تا ادامه کار بررسی گردد.
shervin
۱۱:۰۷ ۱۳۹۴/۰۷/۲۶
سلام
من یک قالب پارالاکس طراحی کردم و برای اینکه در وردپرس فراخوانیش بکنم و دسترسی آسان تری داشته باشم از کدهای پی اچ پی در فانکشن قالبم استفاده کردم و در خصوص فراخوانی متن هم موفق بودم ، ولی متاسفانه در خصوص فراخوانی عکس اصلا" موفق نبودم و هر کار می کنم ادرس رو نصفه ایجاد میکنه و عکس فراخوانی نمیشه. در ادمه قطعه کدی که در فانکشن قرار دادم و همچنین قطعه کدی که برای فراخوانی در اچ تی ام ال گذاشتم رو براتون اینجا میزارم.
من یک قالب پارالاکس طراحی کردم و برای اینکه در وردپرس فراخوانیش بکنم و دسترسی آسان تری داشته باشم از کدهای پی اچ پی در فانکشن قالبم استفاده کردم و در خصوص فراخوانی متن هم موفق بودم ، ولی متاسفانه در خصوص فراخوانی عکس اصلا" موفق نبودم و هر کار می کنم ادرس رو نصفه ایجاد میکنه و عکس فراخوانی نمیشه. در ادمه قطعه کدی که در فانکشن قرار دادم و همچنین قطعه کدی که برای فراخوانی در اچ تی ام ال گذاشتم رو براتون اینجا میزارم.
array( "name" => "گالری کوچک",
"desc" => "عکس مورد نظر را آپلود نمایید",
"id" => $shortname."home",
"type" => "text",
"std" => ""),و کد فراخوانی<?php echo get_option('home'); ?>سوال مبهم است! ظاهرا قسمت درج شده ارتباطی به ایجاد تگ img (که جهت نمایش تصویر استفاده می شود) ندارد! در هر صورت در برنامه هایی مانند وردپرس معمولا باید آدرس قسمت src تصویر را با استفاده از توابع استاندارد در خروجی چاپ کنید، به طور مثال:
<img src="<?php echo get_template_directory_uri();?>/image/icon.png" alt="icon">و یا:<img src="<?php echo esc_url(home_url());?>/image/icon.png" alt="icon">نکته: لطفا مشکلات مربوط به CMS ها را در انجمن های مرتبط مطرح نمائید!۰۳:۱۷ ۱۳۹۴/۰۶/۲۰
درود !
ممنون بابت پاسخگویی، حقیقت خیر خیلی با PHP آشنا نیستم در مورد کدهای اولی که دادم و گفتید باید دید که تابع چه ساختاری دارد و .. کدهای کامل :
ممنون بابت پاسخگویی، حقیقت خیر خیلی با PHP آشنا نیستم در مورد کدهای اولی که دادم و گفتید باید دید که تابع چه ساختاری دارد و .. کدهای کامل :
<?php
$_F_U_Date = date("Y/m/d",$sk['timeline']['time']);
$diff = strtotime(date('Y-m-d')) - strtotime($_F_U_Date);
$Year = floor($diff / (365*60*60*24));
$months = floor(($diff - $Year * 365*60*60*24) / (30*60*60*24));
$day = floor(($diff - $Year * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
?>
سن دلنمایی: <?= e2f($Year) ?> سال و <?= e2f($months) ?> ماه و <?= e2f($day) ?> روز
دوست گرامی ساختار تابع جایی وجود دارد که خود تابع (با عبارت function) تعریف شده، این قمست که درج کرده اید فقط ورودی های تابع است!
۲۲:۴۴ ۱۳۹۴/۰۶/۱۹
خسته نباشید (:
یک سوال :
یک فانکشن نوشتم برای تبدیل اعداد خارجی به اعداد فارسی به اسم e2f
الان چند جای سایتم میخوام اعداد رو فارسی کنم ولی نمیدونم چطور چند تا فانکشن رو همزمان فراخوانی کنم !
مثلا :
و همچنین کد پایین :
یک سوال :
یک فانکشن نوشتم برای تبدیل اعداد خارجی به اعداد فارسی به اسم e2f
الان چند جای سایتم میخوام اعداد رو فارسی کنم ولی نمیدونم چطور چند تا فانکشن رو همزمان فراخوانی کنم !
مثلا :
آخرین زمان فعالیت : <?php echo $jcalendar->ReturnDayName(strtolower($W)); ?> <?php echo $N_Date[2] ?> <?php echo $jcalendar->ReturnMonthName($N_Date[1]) ?> <?php echo $N_Date[0] ?> ساعت <?php
echo $tim;
?>چطوری میتونم فانکشن e2f رو به کد بالا اضافه کنم که بدون مشکل، اعداد فارسی بشن !و همچنین کد پایین :
<?php
echo $sk['timeline']['birth']['year'].'/'.$sk['timeline']['birth']['month'].'/'.$sk['timeline']['birth']['date'];
$miladidate = jalali_to_gregorian(
$sk['timeline']['birth']['year'],sprintf("%02d",$sk['timeline']['birth']['month']),sprintf("%02d", $sk['timeline']['birth']['date']),'-');
?>تشکر ..ابتدا باید دید تابع شما چه ساختار و آرگومان هایی دارد، اگر آرگومان های تابع به ترتیب شامل سال، ماه و روز است و به صورت رشته متنی، می توانید به این صورت هر کجا که تابع در دسترس بود (به فرض فایل آن قبلا include شده بود) آن را فراخوانی کنید:
echo e2f($N_Date[2], $N_Date[1], $N_Date[0]);در واقع هر آرگومانی که بخواهید را در صورتی که قبلا در تابع تعریف کرده باشید، می توان به آن ارسال و در نهایت از خروجی تابع (با return) دریافت کرد، البته در صورتی که آشنایی کافی با مباحث مقدماتی PHP نداشته باشید، توضیح و درک مطلب کمی دشوار خواهد بود!sara
۱۹:۱۲ ۱۳۹۴/۰۵/۳۰
سلام. چه جوری می تونم برای یک تابع سازنده از کاربر مقدار بگیرم در php؟
این آموزش در مورد برنامه نویسی شیء گرا نیست!، صرفا جهت آشنایی می توانید نمونه زیر را مد نظر داشته باشید:
<?php
class Person{
public $name = NULL;
public function __construct($name){
$this->name = $name;
}
}
$person = new Person("You");
echo $person->name;
?>علی
۲۰:۵۵ ۱۳۹۴/۰۲/۲۳
با سلام.
آیا روشی هست که بتوانیم امضای یک تابع را بفهمیم
منظورم توابع استاندارد نیست بلکه توابعی که خودمان می نویسیم. مثلا بفهمیم چند آرگومان دارد و...
همان طور که می دانید در جاوا اسکریپت کافیه نام یک تابع را بدون پرانتز در دستور آلرت قرار دهیم تا ریز و درشت تابع را بهمون نشون بده ایا در php هم چنین کاری می شود کرد؟
با تشکر
آیا روشی هست که بتوانیم امضای یک تابع را بفهمیم
منظورم توابع استاندارد نیست بلکه توابعی که خودمان می نویسیم. مثلا بفهمیم چند آرگومان دارد و...
همان طور که می دانید در جاوا اسکریپت کافیه نام یک تابع را بدون پرانتز در دستور آلرت قرار دهیم تا ریز و درشت تابع را بهمون نشون بده ایا در php هم چنین کاری می شود کرد؟
با تشکر
در PHP روش های خاصی برای نمایش اطلاعات متغیرها، توابع و... وجود دارد، برای توابع می توانید از کلاس ReflectionFunction مطابق نمونه زیر استفاده کنید:
$func = new ReflectionFunction('yourFunction');
$filename = $func->getFileName();
$start_line = $func->getStartLine() - 1;
$end_line = $func->getEndLine();
$length = $end_line - $start_line;
$source = file($filename);
$body = implode("", array_slice($source, $start_line, $length));
print_r($body);اطلاعات بیشتر:http://php.net/manual/en/class.reflectionfunction.phpمیثم
۱۸:۰۷ ۱۳۹۴/۰۲/۲۰
چطور میتونم تعداد رقم های یک عدد و تشخیص بدم؟
با استفاده از تابع strlen این کار امکانپذیر است:
$num_length = strlen((string)$num);محمد
۱۸:۵۴ ۱۳۹۳/۱۱/۲۰
سلام مشکل چیه چرا وقتی از کاراکتر های [ و ] برای replace استفاده می کنم مشکل دار میشه و به خوبی replace انجام نمی شه؟
مثلا می خوام وقتی این کلمه :
[گل]
اون کد عکسی که قرار دادن قرار بگیره!
اگه میشه درستش کنید. منظورم اینه یه راه حل بدید
این کد :
چطوری میشه؟
البته گفتم که با [ و ] مشکل داره اینجاست. تست کنید.
تشکر
مثلا می خوام وقتی این کلمه :
[گل]
اون کد عکسی که قرار دادن قرار بگیره!
اگه میشه درستش کنید. منظورم اینه یه راه حل بدید
این کد :
$sheklak = "[گل] [خنده]";
$result = preg_replace('[گل]' , '<img src=\'1.png\' />', $sheklak );
echo $result;حالا می خوام یه چند تا ریپلیس روش انجام بدم یعنی بتونم اون خنده رو هم براش جایگزین در نظر بگیرمچطوری میشه؟
البته گفتم که با [ و ] مشکل داره اینجاست. تست کنید.
تشکر
تابع preg_replace بر اساس دستورات عبارات باقاعده عمل می کند، از تابع
str_replaceاستفاده کنید.$sheklak = "[گل] [خنده]";
$result = str_replace('[گل]' , '<img src=\'1.png\' />', $sheklak );
$result = str_replace('[خنده]' , '<img src=\'2.png\' />', $result);
echo $result;۱۴:۳۳ ۱۳۹۳/۰۷/۱۵
سلام دوست عزیز
واقعاً کارتون معرکه هست. آفرین، لذت بردم، یه سوال که البته مربوط به مبحث حاضر نمیشه و مربوط به درس هستش و اونم این که چه ادیتوری رو برای نوشتن کد های PHP پیشنهاد می کنید و خودتون استفاده می کنید؟ من مدت زیادی VB, VB.Net، سی پلاس پلاس و سی شارپ کار کردم و از Visual Studio استفاده می کردم، اما تازه سراغ PHP اومدم و می خوام بدونم آیا ادیتوری همچون Visual Studio برای این زبان موجود هست یا خیر؟
با تشکر از شما و آموزش عالیتون
واقعاً کارتون معرکه هست. آفرین، لذت بردم، یه سوال که البته مربوط به مبحث حاضر نمیشه و مربوط به درس هستش و اونم این که چه ادیتوری رو برای نوشتن کد های PHP پیشنهاد می کنید و خودتون استفاده می کنید؟ من مدت زیادی VB, VB.Net، سی پلاس پلاس و سی شارپ کار کردم و از Visual Studio استفاده می کردم، اما تازه سراغ PHP اومدم و می خوام بدونم آیا ادیتوری همچون Visual Studio برای این زبان موجود هست یا خیر؟
با تشکر از شما و آموزش عالیتون
در برنامه نویسی وب عملا نیاز چندانی به وجود برنامه ای چون Visual Studio نیست، برنامه های تحت وب عموما مجموعه ای به هم پیوسته از کدهای زیان سمت سرور (مانند PHP) و سمت کاربر (مانند CSS، JavaScript و...) هستند که در نهایت به صورت قواعد HTML خروجی داده می شوند، لذا برقراری تعامل بین آنها توسط خود برنامه نویس صورت می گیرد، اما برای نوشتن و ویرایش راحتتر کدها و صرفه جویی در وقت، نرم افزارها و IDE هایی وجود دارند که دو مورد زیر توصیه می شود:
- نرم افزاری عالی برای توسعه دهندگان وب: Adobe Dreamweaver
- نرم افزار رایگان و قوی برای برنامه های متن باز: NetBeans IDE
نکته 1: توجه کنید که کدهای PHP و... را با یک ویرایشگر متنی ساده نیز می توان نوشت و اجرا گرفت!
نکته 2: در برنامه نویسی وب به دنبال برنامه های Wizard و تنبلی نباشید، تصور قبلی خود از اپلیکیشن نویسی را فراموش کنید! در غیر این صورت چاره ای جزء انتخاب زبان ASP.NET و استفاده از Visual Studio نیست!
- نرم افزاری عالی برای توسعه دهندگان وب: Adobe Dreamweaver
- نرم افزار رایگان و قوی برای برنامه های متن باز: NetBeans IDE
نکته 1: توجه کنید که کدهای PHP و... را با یک ویرایشگر متنی ساده نیز می توان نوشت و اجرا گرفت!
نکته 2: در برنامه نویسی وب به دنبال برنامه های Wizard و تنبلی نباشید، تصور قبلی خود از اپلیکیشن نویسی را فراموش کنید! در غیر این صورت چاره ای جزء انتخاب زبان ASP.NET و استفاده از Visual Studio نیست!
مومنی
۲۲:۱۲ ۱۳۹۳/۰۶/۰۳
سلام خسته نباشید خدا اجرتون بده
بنده یه سوال راجع به prepared statement دارم میشه بگین این دستورات به چه معنی هستن و کاربردشون چیه اگر میشه یه مثال کامل هم بزنید ممنوم
بنده یه سوال راجع به prepared statement دارم میشه بگین این دستورات به چه معنی هستن و کاربردشون چیه اگر میشه یه مثال کامل هم بزنید ممنوم
توضیح این مبحث در این قسمت ممکن نیست، صرفا در حد اطلاعات اولیه:
Prepared Statement قابلیتی در سیستم های مدیریت پایگاه داده (DBMS) است که در آن اطلاعات پیش از ذخیره در دیتابیس یک بار به صورت آزمایشی اجرا می شوند (مرحله Prepare)، در صورتی که در این اجرا اشکال و خطایی وجود نداشته باشد، اجرای اصلی و نهایی یا Execute اتفاق می افتد، این شیوه به لحاظ قابلیت اجرای چند باره با یک بار Prepare ، می تواند برای نوشتن برنامه های کاربردی مفید باشد، اما مزیت اصلی در جلوگیری از حملات و نفوذ به دیتابیس یا Injection است که از این لحاظ حاشیه امن بسیار خوبی ایجاد می کند.
Prepared Statement در PHP در رابطه با اکستنشن PDO و MySQLi صدق می کند که هر کدام چند روش (استفاده از علامت ?، استفاده از Bind و...) را برای این منظور پشتیبانی می کنند.
نکته: برای درک کامل این قابلیت باید در کنار یادگیری PDO یا MySQLi با آن آشنا شوید.
Prepared Statement قابلیتی در سیستم های مدیریت پایگاه داده (DBMS) است که در آن اطلاعات پیش از ذخیره در دیتابیس یک بار به صورت آزمایشی اجرا می شوند (مرحله Prepare)، در صورتی که در این اجرا اشکال و خطایی وجود نداشته باشد، اجرای اصلی و نهایی یا Execute اتفاق می افتد، این شیوه به لحاظ قابلیت اجرای چند باره با یک بار Prepare ، می تواند برای نوشتن برنامه های کاربردی مفید باشد، اما مزیت اصلی در جلوگیری از حملات و نفوذ به دیتابیس یا Injection است که از این لحاظ حاشیه امن بسیار خوبی ایجاد می کند.
Prepared Statement در PHP در رابطه با اکستنشن PDO و MySQLi صدق می کند که هر کدام چند روش (استفاده از علامت ?، استفاده از Bind و...) را برای این منظور پشتیبانی می کنند.
نکته: برای درک کامل این قابلیت باید در کنار یادگیری PDO یا MySQLi با آن آشنا شوید.
مرتضی
۲۰:۳۰ ۱۳۹۳/۰۵/۲۴
سپاس از پاسخ شما
مرتضی
۱۶:۰۶ ۱۳۹۳/۰۵/۲۴
سلام
در wwwroot وبسایتم یک پوشه دارم (فرض کنید با عنوان dir1). داخل این پوشه یک برنامه php دارم که توش میخوام توسط توابع fopen و fwrite فایل های پوشه قبلی (یعنی wwwroot) تغییر بدم. اما نمیدونم چطور آدرس باید بدم؟
لطفا راهنمایی کنین
در wwwroot وبسایتم یک پوشه دارم (فرض کنید با عنوان dir1). داخل این پوشه یک برنامه php دارم که توش میخوام توسط توابع fopen و fwrite فایل های پوشه قبلی (یعنی wwwroot) تغییر بدم. اما نمیدونم چطور آدرس باید بدم؟
لطفا راهنمایی کنین
به چند روش می توانید این کار را انجام دهید، ساده ترین راه اینکه یک دایرکتوری به عقب برگردید استفاده از علامت
../dirاست، علامت .. به معنی یک دایرکتوری قبل است.fopen('../other_path/file.php');روش دیگر استفاده از define است، در فایل موجود در دایرکتوری مورد نظر ثابت های زیر را تعریف کنید:define('SUB_INDEX_PATH', dirname(__FILE__));
define('INDEX_PATH', dirname(SUB_INDEX_PATH));سپس در ادامه کدها می توانید از این ثابت ها استفاده کنید:fopen(INDEX_PATH.'/other_path/file.php');Zahra
۱۵:۰۹ ۱۳۹۳/۰۴/۱۷
با تشکر از وبسایت خوبتون ، برای من هنوز php نخوندم واقعا مفید بود و امیدوارم بتونم از این آموزش ها در درس هام بهره بگیرم.
مرسی
مرسی
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.