متفاوت بودن خروجی متد خراخوانی شده با متد اصلی

PHP

توسط mahbobe-prog در 5 سال پیش
0 11k 13 5 سال پیش
mahbobe-prog daniel rockstar php-sec vbprogrammer stackoverflow
0

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

function NameDB()
	{		
		$array = glob('sql/*.php') ;
		foreach($array as $num => $fields)
		{
			$name = basename($fields);
			$this -> dbName = ((chop($name , '.php'))) ;
			var_dump( $this -> dbName).'<BR/>' ;
		}
	}

خروجی اون اینه

string(6) "subSql" string(7) "subsql1"


function isDB($dbName)
	{
		$this -> NameDB() ;
		var_dump($this -> dbName) ;
		//foreach($array as $name => $value){} method continue 
		
	}

خروجی این متد

string(6) "subSql" string(7) "subsql1" string(7) "subsql1"


دوتای اول که خروجی همان متد NameDB() هست ولی برای نتیجه var_dump داخل متد isDB() فقط یکیشو داده . براچی اینجوریه؟
0

درسته دیگه! تو متد ()NameDB دوبار نشون میده چون حلقه foreach دارید و دوبار Var_dump اجرا میشه اما تو متد بعدی فقط یه بار دیگه اخرین مقدار پروپرتی dbName رو یه بار دیگه با var_dump خروجی گرفتید کلا میشه ۳ تا.

0

> درسته دیگه! تو متد ()NameDB دوبار نشون میده چون حلقه foreach دارید و دوبار Var_dump اجرا میشه اما تو متد بعدی فقط یه بار دیگه اخرین مقدار پروپرتی dbName رو یه بار دیگه با var_dump خروجی گرفتید کلا میشه ۳ تا.
نه دیگه درست نیست اخه subSql و subSql1 دو تا مجزا هستن که متد اولی داره اونا رو بر میگردونه ولی داخل متد ()isDB بنظرم باید علاوه بر نتیجه متد ()NameDB چون دوباره این متغیر $this -> dbName رو var_dump زدم باید هر دو رو بیاره ولی درحالی که اینطوری نیست چرا؟
0

خب شما در متد NameDB() در پایان کار یه return بگیری به نظرم این مشکل حل میشه

0

> بنظرم باید علاوه بر نتیجه متد ()NameDB چون دوباره این متغیر $this -> dbName رو var_dump زدم باید هر دو رو بیاره ولی درحالی که اینطوری نیست چرا؟
اشتباه شما همینجاست. ببینید شما فقط یه رشته دارید تو dbName میریزید subsql یا subsql1 و آخرین رشته ای که تو dbName قرار میگیره subsql1 هست که توسط حلقه foreach انجام میشه. بعد تو متد دوم شما یه بار دیگه اومدی از مقدار پراپرتی dbName که subsql1 باشه خروجی گرفتی. دوبار تو متد NameDB و یک بار IsDB یعنی var_dump تو متد اول دو بار اجرا میشه و یک بار هم تو متد دوم که کلا میشه سه بار.
0

نتیجه اجرای این کد رو به من میگی؟

<?php

$a=null;

function dbName(){
	global $a;

	$a = 'subsql';
	var_dump($a);

	$a = 'subsql1';
	var_dump($a);
}

function isDB(){
	global $a;
	dbName();
	var_dump($a);
}

isDB();

PHP code - 21 lines - codepad

0

اره حرفتون درست بود ممنونم از پاسخ کاملتون .................... php.sec نتیجه میشه subsql1 چون متغیر a رو global تعریف کردین داخل متد میشه محتوای اون رو تغییر داد

0

الان میخوام که داخل متد ()isDB نتیجه اجرای متد ()NameDB رو استفاده کنم به چه شکلی باید اینکارو بگنم؟

0

> الان میخوام که داخل متد ()isDB نتیجه اجرای متد ()NameDB رو استفاده کنم به چه شکلی باید اینکارو بگنم؟
سلام به همون شکلی که استفاده کردید : $this -> NameDB() ;
0

بله درسته ولی من وقتی داخل متد()NameDB بجای var_dump کردن نتیجه اجرا از return استفاده میکنم فقط نتیجه اخر حلقه رو میده چیکار کنم که هر دو رو بده ؟؟

0

سلام اگر میخواید از return استفاده کنید باید اسم دیتابیسها رو بصورت ارایه تو dbName ذخیره کنید وبعد return کنید.

<?php
class DB{
	protected $dbName;
	
    function NameDB()
    {        
		$this->dbName = array();
        $array = array('subsql.php','subsql1.php');
		
        foreach($array as $num => $fields)
        {
			$name = basename($fields);
			$this -> dbName[] = ((chop($name , '.php'))) ;
			//var_dump( $this -> dbName).'<BR/>' ;
        }
		return $this -> dbName;
    }  



    function isDB()
    {
        $db = $this->NameDB();
		var_dump($db);
    }  
}
$obj = new DB;
$obj->isDB();
?>
0

تابع glob هم نتیجه اجراش یک ارایه هستش و من واسه این ارایه رو مستقیم استفاده نکردم که اگه یه فایل دیگه به پوشه های اون اضافه کنم دیگه لازم نباشه به صورت دستی اسمشو داخل ارایه وارد کنم با این شرایط هم فقط نتیجه اخر حلقه رو میده ولی من هردو رو میخوام چیکار کنم؟

0

چیزی که در نهایت تو db$ ذخیره میشه اسم هر دو یعنی subsql و subsql1 هست

0

ازتون ممنونم ...... درست شد:smilingsmiley:

خوش آمدید

برای طرح سوال، ایجاد بحث و فعالیت در سایت نیاز است ابتدا وارد حساب کاربری خود شوید. در صورتی که هنوز عضو سایت نیستید میتوانید در عرض تنها چند ثانیه ثبت نام کنید.

لطفا ابتدا لاگین کنید