静态方法调用的三种方式: 1、new xx().静态(); //使用对象调用,不推荐 2、xx.静态(); //类名调用,正规调用方法,推荐 3、静态(); //本类的静态方法在本类调用,直接调用...注意事项: 在同包不同类调用的时候,可以直接 类名.方法() 调用,无需创建对象。...在不同包调用的时候,需要引包再调用。 欢迎各位在评论区留言探讨 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如图,是Java中静态代码和实例对象互相调用的规则,我们接下来就讲讲为什么在Java中静态方法不可以调用非静态代码呢。...静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。...因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。...(1)首先,我们可以试一下去掉static,这里不会编译错误,但是运行时会抛出空指针异常,原因是什么呢,原因就是类似于上面说的静态方法不能调用非静态方法的原因了。...(3)不能用一个值为null的引用类型变量来调用非静态方法,这样会抛出空指针异常,但是静态方法可以被一个值为null的引用类型变量调用而不会抛出空指针异常。
Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model...最后在查询中,我们也看到了类似于 查询构造器 的链式调用形式,通过模型的静态 where() 方法返回的实例对象,一步步地构造整个查询。...最后整理下上面的调用链条,首先,我们生成定义的 MTest 是继承自 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 这个抽象类的...然后就是调用 newBelongsTo() 方法生成一个 laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php...它判断的是这个 key 是否是抽象基类 laravel/framework/src/Illuminate/Database/Eloquent/Model.php ,而不是我们定义的 MTest ,用的是一个
类似于这样 namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model {...Illuminate\Database\Query\Builder 调用方法去完成整个SQL。...门面直接调用 Illuminate\Database\DatabaseManager 类。...$parameters); } 转发,调用的是 Illuminate\Database\Connection ,用户处理 table()方法,随后会通过 table() 方法指向 Illuminate\...,首先每个 Eloquent ORM 都需要继承父类 Illuminate\Database\Eloquent\Model 你大概会这样写 User::find(1) 父类是不存在这个方法的,它会通过
Laravel示例(Illuminate\Database\Eloquent\Model.php) 2.魔术常量:__LINE__、__FILE__、__DIR__、__FUNCTION__、__CLASS...2.使用static来实现,通过这种机制,“static::”不再被解析为定义当前方法所在的类,而是在实际运行时计算得到的,即为运行时最初调用的类,不仅限制于静态方法的调用 3.后期静态绑定还可以用于对象实例化中...,在实例化对象时,static会根据运行时调用的类来决定实例化对象,而self是根据所在位置的类来决定实例化对象 4.Laravel示例:Illuminate\Database\Eloquent\Model.php...: SQL语句准备阶段,Illuminate\Database\Query\Grammars SQL语句执行阶段,Illuminate\Database\Connection C.Eloquent ORM...1.两个阶段 Eloquent ORM查询构造器的生成,Illuminate\Database\Eloquent\Model::newQuery() 操作命令的执行,Illuminate\Database
/Database/Eloquent/Collection.php 对象,然后这个对象里面有个 items 属性,是一个数组。...laravel/framework/src/Illuminate/Collections/Collection.php 是集合类,里面的方法大部分都调用的是 laravel/framework/src/...这是一个连续递进的关系,之前在 查询构造器 的文章中,我们已经看到了它的底层就是调用的 原生查询 操作。那么这回,我们再来看一下 Model 中的方法,在底层是不是调用的是 查询构造器 。...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...不过这里需要注意的是,模型默认生成的 QueryBuilder 是 llaravel/framework/src/Illuminate/Database/Eloquent/Builder.php 对象,
上篇文章我们主要讲了Eloquent Model关于基础的CRUD方法的实现,Eloquent Model中除了基础的CRUD外还有一个很重要的部分叫模型关联,它通过面向对象的方式优雅地把数据表之间的关联关系抽象到了...的 belongsTo方法里如果未提供后面的参数会通过debug_backtrace 获取调用者的方法名作为关联名称进而猜测出子模型的外键名称的,按照约定Eloquent 默认使用父级模型名的「snake...'id' // 用户表本地键... ); } } /** * 定义一个远层一对多关联,返回HasManyThrough实例 * @return \Illuminate\Database...,拿到关联实例后会去调用关联实例的 getResults方法返回关联的模型数据。...-01-01"); Relation实例会将这些调用通过 __call转发给子模型的Eloquent Builder去执行。
这篇文章我们来学习Laravel Database地另外一个重要的部分: Eloquent Model。...__callStatic, 调用不存在的实例方法会触发 __call, 很容易就猜到上面这些方法就是通过这两个魔术方法来动态调用的,下面让我们看一下源码。...namespace Illuminate\Database\Eloquent; abstract class Model implements ... { public function __call...查询 通过上面的那些代码我们可以看到对Model调用的这些查询相关的方法最后都会通过 __call转而去调用Eloquent Builder实例的这些方法,Eloquent Builder与底层数据库交互的部分都是依赖...namespace Illuminate\Database\Eloquent; class Builder { public function __construct(QueryBuilder
为什么静态方法不能调用非静态成员? 静态方法不能调用非静态成员的原因是:静态方法在没有对象实例的情况下就可以被调用,而非静态成员必须依赖于对象实例才能访问。...如果允许静态方法调用非静态成员,那么在静态方法中无法确定要访问哪个对象的成员,这将导致逻辑上的混乱和错误。 3. 如何解决静态方法无法调用非静态成员的问题?...如果在静态方法中需要使用非静态成员,可以通过以下两种方式解决: 3.1 创建对象实例 可以在静态方法内部创建一个对象实例,然后通过该对象实例来访问和调用非静态成员。...总结 静态方法不能调用非静态成员的原因是静态方法在没有对象实例的情况下就可以被调用,而非静态成员必须依赖于对象实例才能访问。...为了解决这个问题,可以在静态方法内部创建对象实例来访问和调用非静态成员,或者将非静态成员改为静态成员。但需要注意,在设计程序时要合理使用静态方法和非静态成员,并根据具体需求选择适当的方式。
connection类,然后Model自己是负责领域逻辑,同时会定义一些静态方法,如create,find,save,充当了Row Data Gateway角色,此时的类图如下: 此时新增的Model类直接依赖于...use Illuminate\Database\Query\Builder as BaseBuilder; class Builder extends BaseBuilder { /**...* * @var Illuminate\Database\Eloquent\Model */ protected $model; .... } 里面具体就是在基础..., $foreignKey); } 我们看到当调用Model的hasOne方法后,返回是一个HasOne,即Relation,当我们调用Relation的方法时,是怎么处理的呢?...setRelation($relation, $value) { $this->relations[$relation] = $value; } 最后调用match方法,就是正确的给每个model
\Traits\HasCreator;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes...\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model{ use HasCreator...后面的那个方法和之前的 hasCreator 是一样的,当作自身的方法调用就好啦,是否声明为静态就看自己的需要了。 下面给大家推荐一些在项目中用得到的 Trait,都是从超哥那里摘下来的,哈哈。...\auth()->id(); }); } /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo...** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user()
grammar的compileCommand函数,此处我们调用的是compileCreate函数,至此我们就分析完了数据库表操作的方法,下面我们来看migrations功能。...php namespace App; use Illuminate\Database\Eloquent\Model; class Comment extends Model { /**...第二步setAsGlobal,其动作就做了static::$instance = $this,通过将实例设置为静态变量,我们就能在全局通过静态方法来访问Capsule了。...第三步bootEloquent,通过Eloquent::setConnectionResolver($this->manager)设置了Model的静态变量$resolver,从而能够使用Model。...接着我们看第二个Making a Model,使用上非常简单: //User Model use Illuminate\Database\Eloquent\Model as Eloquent class
软删除功能实际上就是利用了全局作用域功能 实现一个全局作用域功能只需要定义一个实现Illuminate\Database\Eloquent\Scope接口的类,该接口只有一个方法apply,在该方法中增加查询需要的约束...php namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\...php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /**...php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /**...php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /**
现在有了Model 接下来就是 调用他咯 调用 Model up 先创建一个新的控制器 TestMdlController在里面写个index方法 <?...php namespace App\Models; use Illuminate\Database\Eloquent\Model; class BaseModel extends...php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Test extends BaseModel {...new 的方式 $TestMdlNew = new Test(); dump($TestMdlNew->get()->toArray()); //直接调用静态方法...php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Test extends BaseModel {
这在测试的时候很有用,因为你可以注入一个 mock 或者 stub ,并断言在 stub 上调用的各种方法。 通常,真正的静态方法是不可能被 mock 或者 stub。...在下面的例子中,调用了 Laravel 的缓存系统。通过浏览这段代码,可以假定在 Cache 类中调用了静态方法 get: 调用 Cache Facade 中的任何静态方法时, Laravel 会从 服务容器 中解析 cache 绑定,然后在解析出的对象上调用所有的请求方法(本例中是 get)。...php namespace App; use App\Contracts\Publisher; use Illuminate\Database\Eloquent\Model; class Podcast...php namespace App; use Facades\App\Contracts\Publisher; use Illuminate\Database\Eloquent\Model; class
\Database\Eloquent\Scope)的方法apply。...php namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database...\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class StatusScope implements Scope...php namespace App\Models; use Illuminate\Database\Eloquent\Model; class ScopeTest extends...scope前缀,类似于修改器/访问器,并且可以一次性调用多个方法。
php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /**...$primaryKey成员变量覆盖该字段名称,另外,Eloquent假设主键字段是自增的整数,如果你想用非自增的主键或者非数字的主键的话,必须指定模型中的public属性$incrementing为false...php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /**...\Database\Eloquent\ModelNotFoundException异常 $model = App\Flight::findOrFail(1); $model = App\Flight::...php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes
上面说的这两个部分都包括在了 Illuminate/Database包里面,除了作为Laravel的数据库层 Illuminate/Database还是一个PHP数据库工具集, 在任何项目里你都可以通过...db DatabaseManger 作为Database面向外部的接口, DB这个Facade就是DatabaseManager的静态代理。...Eloquent Model 的连接分析器(connection resolver),让model能够用db服务连接数据库。...Connector 在 illuminate/database中连接器Connector是专门负责与PDO交互连接数据库的,我们接着上面讲到的闭包参数 $pdo往下看 createConnector方法会创建连接器...QueryBuilder对象,这个对象里定义里那些我们经常用到的 where, get, first等方法, 它会根据调用的方法生成对应的SQL语句,最后通过Connection对象执行来获得最终的结果
上次说到了JNI调用的具体步骤,先再JAVA类中定义了静态native方法,使用javah命令生成c/c++的head文件,再实现相应的c或者c++函数,今天来看下java非静态native方法在JNI...image.png 对比上面的静态native方法发现:区别只有第二个参数,静态方法是jclass,非静态是jobject 下面开始编写c++代码 #include "my_jni.h" #include...理解:我们java中可以直接使用类名.静态方法的方式在外部调用静态方法,但是非静态方法的外部调用必须使用一个实例化的对象。...反过来看native方法,静态和非静态的区别其实是一样的 接下来,学习使用c/c++获取java的变量,并改变它的值 在JniDemo类中定义一个非静态变量 public String javaStr...静态变量和非静态变量的调用区别不大,有相应的static方法,设置java变量的具体步骤为:获取fieldId->调用GetXXXField方法获取java对象->如果是基本对象,直接使用,引用对象(jobect
领取专属 10元无门槛券
手把手带您无忧上云