【问题标题】:Function inside function not working? [closed]函数内部的函数不起作用? [关闭]
【发布时间】:2016-07-17 03:08:40
【问题描述】:

我试图在函数内部创建一个函数:

<?php
class usermanager extends datamanager {

public $id;
public $name;
public $from;
public $twitter;
public $instagram;
public $skype;

public $regIP;
public $lastIP;
public $email;

public function __construct($exists = false,$uid = 0) {

if ($exists == true) {
$this->id = $uid;
$this->name = $this->fetch("SELECT * FROM users WHERE ID = '".$uid."';")->name;

public function getProfile() {
profile();
}

}

else {

public function new($name,$password,$email) {

$this->autocommit(false);
if (!($do = $this->query("INSERT INTO users (name,password,email,rank) VALUES ('".$name."',PASSWORD('".$password."'),'".$email."','0');"))) {
$this->rollback();
return false;
}
else {
$this->commit();
return true;
}

} //end new()

} //end else

} //end __construct()

public function __set() {

trigger_error("Can not edit read-only variable",E_USER_ERROR);

} //end __set()

private function profile() {

$gets = array("twitter","instagram","skype","from");

$fetch = $this->fetch("SELECT * FROM users WHERE ID = '".$this->id."';");
foreach ($gets as $get) {
$this->$get = $fetch->$get;
}

}

} //end class
?>

因为我看到了this,我以为它会起作用,但我得到了:

解析错误:语法错误,第 21 行 /home/a7405987/usermanager.php 中的意外 T_PUBLIC

为什么这不起作用?


现在已修复,但现在我又遇到了一个错误:

调用未定义的函数getProfile()

我该如何解决这个问题?

【问题讨论】:

  • 第 21 行是什么? public function new?
  • 嗯,是的,函数内部的函数并不是 PHP 中真正存在的东西。
  • @Mr.Llama 接受答案的第一句话:“基本上没有,我一直将其视为解析器的副作用。” 是的,您可以在函数内部编写函数,这实际上会做一些事情,但它可能不会像 OP 认为的那样做,而且它肯定不会不能按照 OP 希望的方式工作。
  • new 是 PHP 中的保留关键字。您无法使用该名称创建函数。
  • @BjörnSchönrock - 您的编辑(关于 mysqloi 的新问题)应该是一个新问题。

标签: php function


【解决方案1】:

在函数中定义函数不是一个好主意。除了类,任何函数定义都是automatically globalpublicprivate 关键字仅在类定义中有效,在类函数中无效。如果您要从内部函数定义中删除 public,它会正常运行,但结果将是全局定义的 getProfile()

这个例子应该有助于说明问题:

<?php

class Test {
    public function foo() {
        function bar() {
            echo "Hello from bar!" . PHP_EOL;
        }

        echo "Hello from foo!" . PHP_EOL;
    }
}

$t = new Test;
// PHP Fatal error:  Call to undefined method Test::bar()
// $t->bar();

// Works, prints "Hello from foo!"
// bar() is now defined, but not where you expect
$t->foo();

// PHP Fatal error:  Call to undefined method Test::bar()
// $t->bar();

// Works, prints "Hello from bar!"
// Note that this is global scope, not from Test
bar();

Demo in action

【讨论】:

    【解决方案2】:

    您不能在成员函数或构造函数中使用修饰符public/private/protected。但是,您可以在方法中声明一个函数:

    public function classMember() {
        function doSomething() {
        //do something
        }
        doSomething()
    }
    

    对于您的特定问题,您应该实例化您的类,然后检查它是否存在,否则插入它。

    您不能根据调用的上下文更改类的结构

    【讨论】:

    • 如果我创建一个新的 usermanager() 并且我想从数据库中获取一个现有用户,我可以使用 usermanager(true,$id);但只有当我使用现有用户时,函数 getProfile() 才必须存在。
    • 但我的问题是,为什么会出现这个错误?
    • 这样做的方法是,如果在没有现有用户的情况下调用 getProfile,则它会引发异常。你得到错误是因为你试图做一些语言语法不允许的事情。这就像试图用中文和印度人说话一样。没用。
    • 那么你没有正确思考这个问题,你应该实例化你的类,然后,从使用它的代码中插入或不插入它。
    • 答案是“因为不允许”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多