以下是我实际代码的编辑版本:
<?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;
}
}
?>
然后在一个单独的文档中,我有一个包含上面的文件。我使用以下函数调用函数get name:
<?=$obj->get_name()?>
get_name实际上包含用于计算两点之间距离的计算,但是因为它的冗长计算我将其从上面的示例中删除了。
重要的是我可以使用$ obj-&gt; get_name()来获取$ lat和$ lng的输出
答案 0 :(得分:3)
函数在函数范围内运行,因此您在get_coordinates()
中设置的变量是局部变量。要创建全局变量,可以使用global关键字:
<?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);
答案 1 :(得分:3)
你正在遇到一个范围问题。变量仅适用于声明它们的函数。要使它们可用,您可以显式地将变量传递给函数(您需要确保始终在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());"
您的代码中存在一些不良做法,但这里有一些快速的步骤来获得您想要的内容。
// 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();
与您的问题无关,但您还应该阅读“SQL注入”,因为get_name()
中的查询容易受到攻击。这里没什么大不了的,因为无论如何数据来自你的其他查询,但仍然是不要在查询字符串中直接使用参数的好习惯。
答案 2 :(得分: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 :(得分:1)
会话如何? https://www.php.net/manual/en/reserved.variables.session.php
session_start();
/*session is started if you don't write this line can't use $_Session global variable*/
$_SESSION["newsession"]=$value;
session_start();
/*session is started if you don't write this line can't use $_Session global variable*/
$_SESSION["newsession"]=$value;
/*session created*/
echo $_SESSION["newsession"];
/*session was getting*/
session_start();
/*session is started if you don't write this line can't use $_Session global variable*/
$_SESSION["newsession"]=$value;
/*it is my new session*/
$_SESSION["newsession"]=$updatedvalue;
/*session updated*/
session_start();
/*session is started if you don't write this line can't use $_Session global variable*/
$_SESSION["newsession"]=$value;
unset($_SESSION["newsession"]);
/*session deleted. if you try using this you've got an error*/
答案 4 :(得分: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();
?>
答案 5 :(得分: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);