2013-09-25 6 views
2

Ниже приводится отредактированная версия моего фактического кода:Передача переменной между функциями - PHP

<?php 

include ('login_info.php'); 

class modernCMS { 

var $host; 
var $username; 
var $password; 
var $db; 
var $url; 


function connect(){ 
    $con = mysql_connect($this->host, $this->username, $this->password); 
    mysql_select_db($this->db, $con) or die(mysql_error()); 

mysql_set_charset('utf8'); 

} 


function get_coordinates(){ 

$sql ="select lat, lng from postcodes LIMIT 1;"; 
    $res = mysql_query($sql) or die(mysql_error()); 
    while($row = mysql_fetch_assoc($res)){ 
     $lat = $row['lat']; 
     $lng = $row['lng']; 

    } 
} 


function get_name(){ 

$sql ="select name from places WHERE lat=$lat AND lng=$lng LIMIT 1;"; 
    $res = mysql_query($sql) or die(mysql_error()); 
    while($row = mysql_fetch_assoc($res)){ 
     $name = $row['name']; 

echo $name; 


    } 
} 


?> 

Затем в отдельном документе я есть включаемый для указанного выше файла. Я называю функцию получить имя, используя следующее:

<?=$obj->get_name()?> 

get_name фактически содержит расчет для вычисления расстояния между двумя точками, однако, поскольку его длительный расчет я оставил его из приведенного выше примера.

Ее важно, что я могу просто использовать $ obj-> get_name(), чтобы получить выход за $ лат и $ LNG

+1

вы можете передать их в качестве параметров – Ibu

+1

Если вам нужен геттер и сеттер, создать объект Coordinate. PHP - это язык ООП :-) –

+0

Вам нужно узнать о [scope scope] (http://php.net/manual/en/language.variables.scope.php). Однако использование таких вещей, как аргументы, возвращает, массивы, объекты и свойства, все * MUCH * предпочтительнее использовать глобальные переменные. – Sammitch

ответ

2

Вы бежите в вопрос определения масштабов. Переменные доступны только для функции, которая их объявила. Чтобы сделать их доступными, вы можете явно передать переменные функции (вам нужно всегда вызывать get_coordinates() до display_coordinates(), хотя в противном случае у вас будут неопределенные значения) или с использованием глобальных переменных (плохая идея).

Лучший способ, вероятно, сделать класс для него (хотя это зависит от того, как вы собираетесь его использовать). Ваши переменные всегда будут в области видимости, и вы не рискуете попытаться запустить функцию display_coordinates(), прежде чем инициализировать переменные.

class Coordinate 
{ 
    // These are the variables where the coords will be stored. 
    // They are available to everything within the {}'s after 
    // "class Coordinate" and can be accessed with 
    // $this->_<varname>. 
    protected $_lat; 
    protected $_long; 

    // This is a special function automatically called when 
    // you call "new Coordinate" 
    public function __construct($lat, $long) 
    { 
     // Here, whatever was passed into "new Coordinate" is 
     // now stored in our variables above. 
     $this->_lat = $lat; 
     $this->_long = $long; 
    } 

    // This takes the values are stored in our variables, 
    // and simply displays them. 
    public function display() 
    { 
     echo $this->_lat; 
     echo $this->_long; 
    } 
} 

// This creates a new Coordinate "object". 25 and 5 have been stored inside. 
$coordinate = new Coordinate(25, 5); // 25 and 5 are now stored in $coordinate. 
$coordinate->display(); // Since $coordinate already "knows" about 25 and 5 
         // it can display them. 

// It's important to note, that each time you run "new Coordinate", 
// you're creating an new "object" that isn't linked to the other objects. 
$coord2 = new Coordinate(99, 1); 
$coord2->display(); // This will print 99 and 1, not 25 and 5. 

// $coordinate is still around though, and still knows about 25 and 5. 
$coordinate->display(); // Will still print 25 and 5. 

Вы должны прочитать на Variable Scope и Classes and Objects, чтобы понять больше об этом.

Чтобы поместить это вместе с исходным кодом, вы могли бы сделать что-то вроде этого,

function get_coordinates() 
{ 
    return new Coordinate(25, 5); 
} 

function display_coordinates($coord) 
{ 
    $coord->display(); 
} 

$c = get_coordinates(); 
display_coordinates($c); 
// or just "display_coordinates(get_coordinates());" 


Edit после вопроса обновляемой

Есть несколько плохих практик в вашем коде, но вот несколько быстрых шагов, чтобы получить то, что вы хотите.

// Copy the Coordinate class from my answer above, but add two new 
// lines before the final "}" 
public function getLatitude() { return $this->_lat; } 
public function getLongitude() { return $this->_long; } 

// Put the Coordinate class definition before this line 
class modernCMS { 

///// 

// In your code, after this line near the top 
var $url; 

// Add this 
var $coord; 

///// 

// In your get_coordinates(), change this... 
$lat = $row['lat']; 
$lng = $row['lng']; 

// To this... 
$this->coord = new Coordinate($lat, $lng); 

///// 

// In your get_name(), add two lines to the start of your function. 
function get_name(){ 
    $lat = $this->coord->getLatitude(); 
    $lng = $this->coord->getLongitude(); 

Unrelated на ваш вопрос, но вы также должны читать о «SQL Injection», как запрос в get_name() уязвима. Здесь не так уж и много, поскольку данные поступают из вашего другого запроса в любом случае, но все же хорошая практика не использовать параметры непосредственно в строке запроса.

+0

Этот пример меня смущает, потому что вы, кажется, устанавливаете значения вне обеих функций. Важно, чтобы значения были заданы в первой функции, они исходят из инструкции sql. –

+0

Я добавлю некоторые комментарии к коду, чтобы попытаться понять его. –

+0

Я добавил комментарии, надеюсь, объясню, что происходит лучше. Однако в таком кратком ответе можно объяснить лишь так много. Чтение двух документов, на которые я ссылался в конце, будет лучшим способом получить полное представление о том, что происходит. Не отвлекайтесь на длину документов, это не то, что легко понять поначалу, но и предметная область, и классы/объекты - важная тема для изучения. –

1

Один из способов сделать это:

function get_coordinates(&$lat, &$lng) 
{ 
    $lat = 25; 
    $lng = 5; 
} 

function display_coordinates($lat, $lng) 
{ 
    echo $lat; 
    echo $lng; 
} 

$lat = 0; 
$lng = 0; 

// assign values to variables 
get_coordinates($lat, $lng); 

// use function to display them... 
display_coordinates ($lat, $lng); 
3

функции работают в пределах области видимости функции , поэтому переменные, которые вы установили в get_coordinates(), являются локальными переменными. Для того, чтобы создать глобальные переменные, вы можете использовать глобальное ключевое слово:

<?php 

function get_coordinates() 
{ 
global $lat, $lng; 
$lat = 25; 
$lng = 5; 
} 

function display_coordinates() 
{ 
global $lat, $lng; 
echo $lat; 
echo $lng; 
} 

get_coordinates(); 
display_coordinates(); 

Или $GLOBALS массив:

<?php 

function get_coordinates() 
{ 
$GLOBALS['lat'] = 25; 
$GLOBALS['lng'] = 5; 
} 

function display_coordinates() 
{ 
echo $GLOBALS['lat']; 
echo $GLOBALS['lng']; 
} 

get_coordinates(); 
display_coordinates(); 

Однако, это может быть не лучший способ установить/получить доступ к этим переменным, так как любая функция может изменить их состояние в любое время, и вы должны вызвать одну функцию, чтобы установить их перед вызовом другого, чтобы отобразить их. Если вы можете описать свою конкретную цель, вы можете получить лучший совет.

Один лучше пути для достижения этой цели является использование класса, и передать объект, где вам это нужно (этот простой пример не демонстрирует надлежащий encapsulation, но является хорошей отправной точкой):

<?php 

class Coordinates { 
    public $lat; 
    public $lng; 

    public function __construct($lat, $lng) { 
    $this->lat = $lat; 
    $this->lng = $lng; 
    } 

    public function display_coordinates() { 
    echo $this->lat . "\n"; 
    echo $this->lng . "\n"; 
    } 
} 

function get_coordinates() { 
    return new Coordinates(25, 5); 
} 

$coords = get_coordinates(); 
$coords->display_coordinates(); 


function output_coordinates($coordinates) { 
    $coordinates->display_coordinates(); 
} 
output_coordinates($coords); 

Другой способ, который обычно используется в PHP, - передать объекты в ассоциативных массивах (массивы со строками для индексов). Я не предпочитаю это, как правило, потому что массив не заявляет, что он намерен провести, но это вариант:

<?php 

function get_coordinates() { 
    return array('lat' => 25, 'lng' => 5); 
} 

function output_coordinates($coordinates) { 
    echo $coordinates['lat'] . '\n'; 
    echo $coordinates['lng'] . '\n'; 
} 

$coords = get_coordinates(); 
output_coordinates($coords); 
+0

- это классы и объекты автоматически * лучше *? –

+0

@ Дагон Нет? Я тоже не хотел этого подразумевать. Но это помогает с зависимостями, инкапсулированием и ответственностью, потому что вы объединяете подобные свойства и методы вместе, устраняя бремя запоминания того, что находится в глобальном пространстве (и в какой точке). Этот код не намного длиннее или сложнее, но еще более организован и прост в распространении. – Nicole

+0

его кричащий смелый, который меня достал, но никакой борьбы с булочкой не было ;-) –

0

Создать Coordinate.class.php файл:

<?php 
class Coordinate { 
    var $latitude; 
    var $longitude; 

    public function getLatitude() { 
    return $this->latitude; 
    } 

    protected function setLatitude($latitude) { 
    $this->latitude = floatval($latitude); 
    } 

    public function getLongitude() { 
    return $this->longitude; 
    } 

    protected function setLongitude($longitude) { 
    $this->longitude = floatval($longitude); 
    } 

    public function __construct() { 
    // Overload 
    if (func_num_args() == 2) { 
     $this->setLatitude(func_get_arg(0)); 
     $this->setLongitude(func_get_arg(1)); 
    } 
    // Default 
    else { 
     $this->setLatitude(0); 
     $this->setLongitude(0); 
    } 
    } 

    public function displayCoordinate() { 
    printf("Latitude: %.2f, Longitude: %.2f\n", 
     $this->getLatitude(), 
     $this->getLongitude()); 
    } 
} 

function main() { 
    $c = new Coordinate (25, 5); 
    $c->displayCoordinate(); 
} 

main(); 
?> 
0

Изменения другого поста .. Я думаю, что лучший способ:

function get_coordinates() 
{ 
    return array(
     "lat" => 25, 
     "lng" => 5 
    ); 

} 

function display_coordinates($latLongArray) 
{ 
    echo $latLongArray['lat']; 
    echo $latLongArray['lng']; 
} 


// assign values to variables 
$latLongArray = get_coordinates(); 

// use function to display them... 
display_coordinates ($latLongArray); 
Смежные вопросы